1. 程式人生 > >Rocketmq基於docker部署並在Springboot中接入

Rocketmq基於docker部署並在Springboot中接入

oot build 物理機 run lba 出現 string類 port reat

服務器部署

關於在服務器上安裝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 "[email protected]"
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.自己寫文檔

Rocketmq基於docker部署並在Springboot中接入