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 的基础使用,也欢迎大家继续深入学习其高级用法与优化策略。