Docker部署RocketMQ
2024年1月2日约 916 字
前置知识:至少要会用Docker和SpringBoot,最好懂RocketMQ中Topic的概念。
RocketMQ服务架构

NameServer会记录各个Broker注册到服务列表并记录它们的IP地址,外部应用只需要访问NameServer,最后都会被转到与broker直接连接。
部署过程
1. 编辑docker-compose文件
根据RocketMQ服务架构,需要部署三个容器服务(确实比RabbitMQ要麻烦)
docker-compose文件:
services:
namesrv:
image: apache/rocketmq:5.3.1
container_name: rmqnamesrv
restart: always
ports:
- 9876:9876
command: sh mqnamesrv
networks:
- my-network
broker:
image: apache/rocketmq:5.3.1
container_name: rmqbroker
restart: always
ports:
- 10909:10909
- 10911:10911
- 10912:10912
environment:
- NAMESRV_ADDR=rmqnamesrv:9876
volumes:
- ./rocketmq/broker/broker.conf:/home/rocketmq/rocketmq-5.3.1/conf/broker.conf
depends_on:
- namesrv
networks:
- my-network
command: sh mqbroker -c /home/rocketmq/rocketmq-5.3.1/conf/broker.conf
console:
image: pangliang/rocketmq-console-ng
container_name: rmqconsole
restart: always
depends_on:
- broker
- namesrv
environment:
- JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876
ports:
- "9999:8080"
networks:
- my-network
networks:
rocketmq-network:
driver: bridge2. 创建broker的配置文件
只需要给broker搞配置文件,nameServer和console不需要
在docker-compose.yaml同目录下创建文件/rocketmq/broker/broker.conf
然后在broker.conf中填入以下内容,其中重点关注brokerIP1,其他直接复制即可
# 所属集群名字
brokerClusterName=DefaultCluster
# broker的名字,同一集群中每个broker名字必须唯一
brokerName=broker-a
# 这里0表示Master,大于0表示Slave
brokerId=0
# nameServer地址,如果使用容器,不要填可能会变化的容器内ip地址,直接填容器名
namesrvAddr=rmqnamesrv:9876
# 这里是关键,容易导致错误!如果在windows中使用docker desktop,这里一定要改成主机windows的ip地址,因为brokerIP1是注册到NameServer中的IP
# 最后程序会访问brokerIP1:19011,根据docker的特性,如果不填宿主机IP,无法访问到指定端口。
brokerIP1=192.168.1.6
# 开启VIP通道可以提高通信优先级或效率
# sendMessageWithVIPChannel=false
# 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
# 是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭 !!!这里仔细看是 false,false,false
autoCreateTopicEnable=true
# 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
# Broker 对外服务的监听端口
listenPort=10911
# 删除文件时间点,默认凌晨4点
deleteWhen=04
# 文件保留时间,默认48小时
fileReservedTime=120
# commitLog 每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
# ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
# destroyMapedFileIntervalForcibly=120000
# redeleteHangedFileInterval=120000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 存储路径
# storePathRootDir=/home/ztztdata/rocketmq-all-4.1.0-incubating/store
# commitLog 存储路径
# storePathCommitLog=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/commitlog
# 消费队列存储
# storePathConsumeQueue=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/consumequeue
# 消息索引存储路径
# storePathIndex=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/index
# checkpoint 文件存储路径
# storeCheckpoint=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/checkpoint
# abort 文件存储路径
# abortFile=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/abort
# 限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker 的角色
# - ASYNC_MASTER 异步复制Master
# - SYNC_MASTER 同步双写Master
# - SLAVE
brokerRole=ASYNC_MASTER
# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
# 发消息线程池数量
# sendMessageThreadPoolNums=128
# 拉消息线程池数量
# pullMessageThreadPoolNums=128输入docker compose up -d启动容器
启动后访问localhost:9999,确保能正确访问到控制台
3. 在SpringBoot中使用并测试RocketMQ
我这里的SpringBoot用的是2.6.3版本
依赖包:
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.3</version>
</dependency>配置文件:
rocketmq:
name-server: localhost:9876
producer:
group: my-producer-groupJunit测试代码:
@SpringBootTest
public class RocketMQTest {
@Resource
private RocketMQTemplate rocketMQTemplate;
@Test
public void test() {
// 发送给消息给主题名为"my-topic"的topic
rocketMQTemplate.convertAndSend("my-topic", "你好呀");
}
}如果发送成功,在localhost:9999控制台中查看是否接收到信息
收到则部署成功