1.拉取RocketMQ镜像
这里以dockerhub上 RocketMQ 5.2.0版本的镜像为例,介绍部署过程。
bash
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/rocketmq:5.2.0
2.创建容器共享网络
RocketMQ 中有多个服务,需要创建多个容器,创建 docker 网络便于容器间相互通信。
bash
docker network create rocketmq
3.启动NameServer
启动 NameServer
bash
docker run -d --name rmqnamesrv -p 9876:9876 --network rocketmq apache/rocketmq:5.2.0 sh mqnamesrv
验证 NameServer 是否启动成功
bash
docker logs -f rmqnamesrv
4.启动 Broker+Proxy
配置 Broker 的IP地址
echo "brokerIP1=127.0.0.1" > broker.conf
启动 Broker 和 Proxy
bash
docker run -d \
--name rmqbroker \
--network rocketmq \
-p 10912:10912 -p 10911:10911 -p 10909:10909 \
-p 8080:8080 -p 8081:8081 \
-e "NAMESRV_ADDR=rmqnamesrv:9876" \
-v ./broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf \
registry.cn-hangzhou.aliyuncs.com/qiluo-images/rocketmq:5.2.0 sh mqbroker --enable-proxy \
-c /home/rocketmq/rocketmq-5.3.0/conf/broker.conf
验证 Broker 是否启动成功
bash
docker exec -it rmqbroker bash -c "tail -n 10 /home/rocketmq/logs/rocketmqlogs/proxy.log"
5.SDK测试消息收发
工具测试完成后,我们可以尝试使用 SDK 收发消息。这里以 Java SDK 为例介绍一下消息收发过程,可以从 rocketmq-clients 中参阅更多细节。
在IDEA中创建一个Java工程。
在 pom.xml 文件中添加以下依赖引入Java依赖库,将 rocketmq-client-java-version 替换成 最新的版本.
bash
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>5.2.0</version>
</dependency>
注意 镜像是5.2.0 那么 依赖也必须是5.2.0
进入broker容器,通过mqadmin创建 Topic。
bash
$ docker exec -it rmqbroker bash
$ sh mqadmin updatetopic -t TestTopic -c DefaultCluster
在已创建的Java工程中,创建发送普通消息程序并运行,示例代码如下:
bash
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
public class RocketMQProducer {
public static void main(String[] args) {
// 创建一个生产者
DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
try {
// 设置 NameServer 的地址
producer.setNamesrvAddr("localhost:9876");
producer.start();
// 创建消息
Message msg = new Message("TopicTest", "TagA", "KeyA", "Hello RocketMQ".getBytes());
// 发送消息
producer.send(msg);
System.out.println("Message sent: " + new String(msg.getBody()));
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭生产者
producer.shutdown();
}
}
}
在已创建的Java工程中,创建订阅普通消息程序并运行。Apache RocketMQ 支持SimpleConsumer和PushConsumer两种消费者类型,您可以选择以下任意一种方式订阅消息。
bash
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
public class RocketMQConsumer {
public static void main(String[] args) {
// 创建一个消费者
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName");
try {
// 设置 NameServer 的地址
consumer.setNamesrvAddr("localhost:9876");
consumer.subscribe("TopicTest", "*"); // 订阅主题和标签
// 注册消息监听器
consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
for (MessageExt msg : msgs) {
System.out.println("Message received: " + new String(msg.getBody()));
}
return null; // 返回 null 表示消费成功
});
// 启动消费者
consumer.start();
System.out.println("Consumer started");
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 停止容器
完成实验后,我们可以通过以下方式停止容器。
停止 NameServer 容器
bash
docker stop rmqnamesrv
停止 Broker 容器
bash
docker stop rmqbroker
docker 镜像安装rocketmq-dashboard
安装docker,拉取 rocketmq-dashboard 镜像
bash
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/rocketmq-dashboard:latest
docker 容器中运行 rocketmq-dashboard
bash
docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=127.0.0.1:9876" -p 8080:8080 -t registry.cn-hangzhou.aliyuncs.com/qiluo-images/rocketmq-dashboard:latest
namesrv.addr:port 替换为 rocketmq 中配置的 nameserver 地址:端口号
开放端口号:8080,9876,10911,11011 端口
云服务器:设置安全组访问规则
本地虚拟机:关闭防火墙,或 -add-port
源码安装
源码地址:apache/rocketmq-dashboard
下载并解压,切换至源码目录 rocketmq-dashboard-master/
① 编译 rocketmq-dashboard
① 编译 rocketmq-dashboard
bash
$ mvn clean package -Dmaven.test.skip=true
运行 rocketmq-dashboard
bash
$ java -jar target/rocketmq-dashboard-1.0.1-SNAPSHOT.jar
示:Started App in x.xxx seconds (JVM running for x.xxx) 启动成功
浏览器页面访问:namesrv.addr:8080
关闭 rocketmq-dashboard : ctrl + c
再次启动:执行 ②
tips:下载后的源码需要上传到 Linux 系统上编译,本地编译可能会报错。