RocketMQ Docker 部署教程
前言
在本教程中,我将教会你如何使用 Docker 部署 RocketMQ。RocketMQ 是一个开源的分布式消息中间件,具有高性能、高可靠性和强大的扩展性。通过 Docker 部署可以简化安装和配置过程,提高部署效率。
整体流程
下面是部署 RocketMQ 的整体流程:
st=>start: 开始
op1=>operation: 创建网络
op2=>operation: 启动 Namesrv
op3=>operation: 启动 Broker
op4=>operation: 创建 Producer
op5=>operation: 创建 Consumer
e=>end: 完成
st->op1->op2->op3->op4->op5->e
步骤说明
步骤 1:创建网络
在 Docker 中,我们需要为 RocketMQ 创建一个自定义网络,以便容器可以相互通信。在终端中执行以下命令:
docker network create rocketmq-network
步骤 2:启动 Namesrv
Namesrv 是 RocketMQ 的命名服务,负责协调消息的发送和接收。在终端中执行以下命令:
docker run -d \
--name rmqnamesrv \
--network rocketmq-network \
-p 9876:9876 \
-e "NAMESRV_ADDR=127.0.0.1:9876" \
rocketmqinc/rocketmq:4.9.1 namesrv
以上命令会在后台启动一个容器,并将容器的 9876 端口映射到主机的 9876 端口。同时,使用环境变量 NAMESRV_ADDR
来设置 Namesrv 的地址。
步骤 3:启动 Broker
Broker 是 RocketMQ 的消息存储和传输节点,负责存储和转发消息。在终端中执行以下命令:
docker run -d \
--name rmqbroker \
--network rocketmq-network \
-p 10911:10911 \
-p 10909:10909 \
-e "NAMESRV_ADDR=rmqnamesrv:9876" \
-e "BROKER_IP1=rmqbroker" \
-e "BROKER_PORT1=10911" \
-e "BROKER_PORT2=10909" \
rocketmqinc/rocketmq:4.9.1 broker
以上命令会在后台启动一个容器,并将容器的 10911 和 10909 端口分别映射到主机的相应端口。使用环境变量 NAMESRV_ADDR
来设置 Namesrv 的地址,BROKER_IP1
来设置 Broker 的 IP 地址,BROKER_PORT1
和 BROKER_PORT2
来设置 Broker 的端口。
步骤 4:创建 Producer
Producer 是消息的生产者,用于发送消息到 RocketMQ。你可以在你的应用程序中使用以下代码创建一个 Producer:
Properties properties = new Properties();
properties.setProperty("rocketmq.namesrv.addr", "127.0.0.1:9876");
DefaultMQProducer producer = new DefaultMQProducer("producer_group");
producer.setNamesrvAddr(properties.getProperty("rocketmq.namesrv.addr"));
// 发送消息
Message msg = new Message("topic", "tag", "message body".getBytes());
SendResult sendResult = producer.send(msg);
System.out.println(sendResult);
以上代码创建了一个 RocketMQ Producer,并发送了一条消息到指定的 Topic。你需要将 rocketmq.namesrv.addr
设置为 Namesrv 的地址。
步骤 5:创建 Consumer
Consumer 是消息的消费者,用于从 RocketMQ 接收消息。你可以在你的应用程序中使用以下代码创建一个 Consumer:
Properties properties = new Properties();
properties.setProperty("rocketmq.namesrv.addr", "127.0.0.1:9876");
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");
consumer.setNamesrvAddr(properties.getProperty("rocketmq.namesrv.addr"));
// 订阅消息
consumer.subscribe("topic", "*");
// 消费消息
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> messages, ConsumeConcurrentlyContext context) {
for (MessageExt message : messages) {
System.out.println(new String(message.getBody()));
}
return Con