Rocketmq基于docker部署并在Springboot中接入
服务器部署
关于在服务器上安装docker并启动守护进程,这里不再赘述,此处假设服务器已经安装完成docker。
安装并运行nameserver
docker run -d -p 9876:9876 -vpwd/data/namesrv/logs:/fddata/rocketmq/logs -vpwd/data/namesrv/store:/fddata/rocketmq/store --name rmqnamesrv rocketmqinc/rocketmq:4.4.0 sh mqnamesrv -n IP:9876
IP填写服务器对外暴露的IP地址
tips:
- nameserver的端口无法修改,因此如果需要集群部署,必须要部署在不同的IP地址中
安装并运行broker
由于在公司中只有一台物理机,在一台物理机上部署多台master意义并不大,在这里我只部署了一台master一台slave。部署master和slave,需要读取不同的配置文件,因此需要基于不同的配置文件构建两个镜像。
- master broker.conf
brokerClusterName = broker-a
brokerName = broker-a-m
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1=IP
listenPort=port
- slave broker.conf
brokerClusterName = broker-a
brokerName = broker-a-s
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1=IP
listenPort=port
IP这一栏必须要填写,否则broker默认会采用内网IP,虽然能连上,但是外网无法访问,无法使用,port一栏可以修改端口,默认是10911和10909,如果不想使用这两个端口,可以通过这个参数修改,同时谨记,VIP端口和普通端口-2,所以在设置端口的时候不要重复了.比如master的端口设置成了8080,name启动的同时如果没有禁用掉VIP端口,那么同时还会占用8078端口,设置slave端口的时候要避开这两个端口
- Dockerfile
#version 1.0.0
FROM rocketmqinc/rocketmq:4.4.0
MAINTAINER ABC "XXXX@ABC.com"
ADD broker.conf /opt/rocketmq-4.4.0/conf/broker.conf
- 在当前目录进行镜像打包:
docker build -t="broker-m" .
,docker build -t="broker-s" .
docker命令
- master
docker run -d -p PORT1:PORT1 -pPORT2:PORT2 -v `pwd`/data/broker/logs:PATH/logs -v `pwd`/data/broker/store:PATH/store --name rmqbroker-m --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" broker-m sh mqbroker -c ../conf/broker.conf autoCreateTopicEnable=true
- slave
docker run -d -p PORT1:PORT1 -p PORT2:PORT2 -v `pwd`/data/broker/logs:PATH/logs -v `pwd`/data/broker/store:PATH/store --name rmqbroker-m --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" broker-s sh mqbroker -c ../conf/broker.conf autoCreateTopicEnable=true
其中,PORT指向broker端口,PATH指向物理机中挂载的文件地址

如果看到这三行成功运行,表示启动成功

同时在console界面也能看到一主一从已经启动成功。在实际部署的过程中,发现console如果采用docker形式部署,会出现无法访问物理机IP的情况,建议console不要使用docker部署而是直接部署到物理机上
springboot接入rocketmq
pom文件:
<!-- rocketmq -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
producer
在application.propertis中加入
# rocketmq
rocketmq.name-server=IP:PORT
rocketmq.producer.group=producerGroup
IP和PORT填写之前启动nameserver时的IP和PORT,producer.group指定任意名字
之后在需要使用的地方注入 RocketMQTemplate即可。
SendCallback
如果调用asyncSend方法,则需要指定回调方法用于发送成功后的处理
consumer
在application.propertis中加入
# rocketmq
rocketmq.name-server=IP:PORT
IP和PORT填写之前启动nameserver时的IP和PORT
RocketMQListener
编写类实现 RocketMQListener 接口, RocketMQListener接收一个泛型作为参数,经测试常用或者说实用的就两种: String 和 MessageExt,其中, String类型接收的参数即为生产者发送的消息内容, MessageExt则包含了除消息内容之外的许多东西,可以按需实用。如果实用MessageExt,那么接收到的消息是byte数组,可以使用String res = new String(message.getBody(), CharEncoding.UTF_8)
该行代码来转为 String
总结
至此整体部署就已经完成了,这里不得不吐槽一下,文档缺失的内容实在是有点多,真是符合了程序员最讨厌的两件事:1.接手的项目没有文档 2.自己写文档