Docker部署RocketMQ

Author Avatar
ciky 11月 04,2024
  • 在其它设备中阅读本文章
  • 点击生成二维码

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

image20241104195840209.png

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));
    }
}