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.自己写文档

posted @ 2019-05-07 16:19  吹哔战将  阅读(1270)  评论(0编辑  收藏  举报