Docker部署RocketMQ
1 部署RocketMQ
(1) 拉取镜像
# 拉取镜像
docker pull apache/rocketmq:4.9.4
(2) 创建容器共享网络
#创建容器共享网络
docker network create rocketmq
(3) 创建namesrv服务
#创建 namesrv 数据存储路径
mkdir -p /mydata/rocketmq/nameserver/logs /mydata/rocketmq/nameserver/bin
# 授权文件
chmod 777 -R /mydata/rocketmq/nameserver/*
# 创建容器
docker run -d \
--privileged=true --name rmqnamesrv \
apache/rocketmq:4.9.4 sh mqnamesrv
# 拷贝启动脚本
docker cp rmqnamesrv:/home/rocketmq/rocketmq-4.9.4/bin/runserver.sh /mydata/rocketmq/nameserver/bin/
# 删除容器 NameServer
docker rm -f rmqnamesrv
# 启动容器 NameServer
docker run -d --network rocketmq \
--privileged=true --restart=always \
--name rmqnamesrv -p 9876:9876 \
-v /mydata/rocketmq/nameserver/logs:/home/rocketmq/logs \
-v /mydata/rocketmq/nameserver/bin/runserver.sh:/home/rocketmq/rocketmq-4.9.4/bin/runserver.sh \
apache/rocketmq:4.9.4 sh mqnamesrv
(4) 创建broker节点
#创建broker数据数据卷
mkdir -p /mydata/rocketmq/broker/logs /mydata/rocketmq/broker/store /mydata/rocketmq/broker/conf /mydata/rocketmq/broker/bin
# 授权文件
chmod 777 -R /mydata/rocketmq/broker/*
# 创建broker.cnf文件
vim /mydata/rocketmq/broker/conf/broker.conf
##############################
# 集群名称
brokerClusterName = DefaultCluster
# 节点名称
brokerName = broker-a
# broker id节点ID, 0 表示 master, 其他的正整数表示 slave,不能小于0
brokerId = 0
# 在每天的什么时间删除已经超过文件保留时间的 commit log,默认值04
deleteWhen = 04
# 以小时计算的文件保留时间 默认值72小时
fileReservedTime = 48
# Broker角色
brokerRole = ASYNC_MASTER
# 刷盘方式
flushDiskType = ASYNC_FLUSH
# Broker服务地址 String 内部使用填内网ip,如果是需要给外部使用填公网ip
brokerIP1 = 192.168.65.128
diskMaxUsedSpaceRatio=95
##############################
# 启动容器 Broker
docker run -d \
--restart=always \
--name rmqbroker \
--network rocketmq \
--link rmqnamesrv:namesrv \
--privileged=true \
-p 10911:10911 \
-p 10912:10912 \
-p 10909:10909 \
-v /mydata/rocketmq/broker/logs:/root/logs \
-v /mydata/rocketmq/broker/store:/root/store \
-v /mydata/rocketmq/broker/conf/broker.conf:/home/rocketmq/rocketmq-4.9.4/conf/broker.conf \
-e "NAMESRV_ADDR=namesrv:9876" \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m" \
-e "MAX_POSSIBLE_HEAP=200000000" \
apache/rocketmq:4.9.4 \
sh mqbroker -c /home/rocketmq/rocketmq-4.9.4/conf/broker.conf
(5) 创建rocketmq-console
#拉取镜像
docker pull styletang/rocketmq-console-ng
#启动容器
docker run -d \
--restart=always \
--network rocketmq \
--name rmqadmin \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-p 8081:8080 \
--ulimit nofile=1024 \
styletang/rocketmq-console-ng:latest
2 集成RocketMQ
(1) 引入依赖
<!--RocketMQ-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.3</version>
</dependency>
(2) 修改配置文件
### RocketMQ ###
rocketmq:
name-server: http://192.168.65.128:9876
producer:
group: default
(3) 发送消息
springboot3不认识RocketMQTemplate,注入会报错
原因: spring.factories功能在springBoot3.0被移除
解决: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration
@Resource
private RocketMQTemplate rocketMQTemplate;
//发送MQ排队购票
String reqJson = JSON.toJSONString(confirmOrderDoDto);
LOG.info("排队购票,发送MQ开始,消息:{}",reqJson);
rocketMQTemplate.convertAndSend(RocketMQTopicEnum.CONFIRM_ORDER.getCode(),reqJson);
LOG.info("排队购票,发送MQ结束");
(4) 接收消息
@Service
@RocketMQMessageListener(consumerGroup = "default",topic = "CONFIRM_ORDER")
public class ConfirmOrderConsumer implements RocketMQListener<MessageExt> {
private static final Logger LOG = LoggerFactory.getLogger(ConfirmOrderConsumer.class);
@Override
public void onMessage(MessageExt messageExt) {
byte[] body = messageExt.getBody();
LOG.info("RocketMQ收到消息:{}",new String(body));
}
}