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_PORT1BROKER_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