Docker 中启动 RocketMQ Broker

RocketMQ 是一个分布式消息中间件,广泛应用于现代互联网架构。将 RocketMQ 部署在 Docker 中,可以轻松实现隔离和便携。本文将详细介绍如何在 Docker 中启动 RocketMQ Broker,并提供相应的代码示例。

一、环境准备

在开始之前,确保你的机器上已安装 Docker。可以通过以下命令检查 Docker 是否已经安装:

docker --version

如果没有安装,可以参考 Docker 官方文档进行安装。

二、下载 RocketMQ 镜像

接下来,我们需要下载 RocketMQ 的 Docker 镜像。可以使用以下命令获取最新版的 RocketMQ 镜像:

docker pull apache/rocketmq:latest

确保镜像下载完成,可以通过以下命令查看本地镜像:

docker images

三、启动 NameServer

RocketMQ 使用 NameServer 来提供服务发现和路由功能。在 Docker 中,我们可以通过以下命令启动 NameServer:

docker run -d --name rmqnamesrv -p 9876:9876 apache/rocketmq:latest sh mqnamesrv

上述命令中:

  • -d 表示后台运行容器。
  • --name rmqnamesrv 指定容器的名称。
  • -p 9876:9876 将本地的 9876 端口映射到容器的 9876 端口。

四、启动 Broker

接下来启动 Broker,Broker 默认会向 NameServer 注册。下面是启动 Broker 的命令:

docker run -d --name rmqbroker \
  --env "NAMESRV_ADDR=rmqnamesrv:9876" \
  -p 10911:10911 \
  apache/rocketmq:latest \
  sh mqbroker -n rmqnamesrv:9876

在这里:

  • --env "NAMESRV_ADDR=rmqnamesrv:9876" 设置 Broker 的 NameServer 地址。
  • -p 10911:10911 将本地的 10911 端口映射到容器的 10911 端口。

五、验证服务

接下来,我们可以通过以下命令确认我们的 Broker 是否启动成功:

docker logs rmqbroker

如果输出的信息中包含 "The broker[xxx,xxx] is up and running.",说明 Broker 正常运行。

六、消息发送与接收

RocketMQ 可以通过 Producer 发送消息和 Consumer 接收消息。下面是使用 Java 编写的简单示例:

1. 创建 Producer

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

public class Producer {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup");
        producer.setNamesrvAddr("localhost:9876");
        producer.start();

        Message msg = new Message("TopicTest", "TagA", "Hello RocketMQ".getBytes());
        SendResult sendResult = producer.send(msg);

        System.out.println(sendResult);
        producer.shutdown();
    }
}

2. 创建 Consumer

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.MessageListener;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.common.message.MessageExt;

public class Consumer {
    public static void main(String[] args) throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup");
        consumer.setNamesrvAddr("localhost:9876");
        consumer.subscribe("TopicTest", "*");

        consumer.registerMessageListener((MessageListener) (list, context) -> {
            for (MessageExt msg : list) {
                System.out.println("Received: " + new String(msg.getBody()));
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });

        consumer.start();
        System.out.println("Consumer Started.");
    }
}

七、流程图

下面是 RocketMQ 启动过程的流程图:

flowchart TD
    A[开始] --> B[下载 RocketMQ 镜像]
    B --> C[启动 NameServer]
    C --> D[启动 Broker]
    D --> E[验证 Broker 状态]
    E --> F[发送与接收消息]
    F --> G[结束]

八、序列图

以下是 Producer 和 Broker 之间的消息发送流程的序列图:

sequenceDiagram
    participant P as Producer
    participant B as Broker

    P->>B: 发送消息
    B-->>P: 确认消息
    Note over P,B: 处理完成

结尾

通过本文,在 Docker 中启动 RocketMQ Broker 的流程以及基本的消息发送和接收的操作已经能得到简单的实现。RocketMQ 因其高可扩展性和可靠性,成为消息中间件的热门选择。希望本文能够帮助开发者快速上手 RocketMQ 的基础使用,也欢迎大家继续深入学习其高级用法与优化策略。