基於mac的docker搭建rocketmq埋坑


1.下載官方的docker腳本https://github.com/apache/rocketmq-docker

2.解壓縮,目錄如下:

 

 

 3.官方步驟,執行,注RMQ-VERSION是rocketmq對應的鏡像版本,BASE-IMAGE可選alpine或centos,我選了alpine

cd image-build
sh build-image.sh RMQ-VERSION BASE-IMAGE

4.執行完成后,本地會有docker的鏡像如下:

 

 5.切換到template目錄下,創建一個簡單的單例,需要執行play-docker.sh,需要修改下腳本文件內容,替換ROCKETMQ_VERSION相關的版本信息,保證與第三步生成鏡像的版本一致

實際執行參考內容如下:

start_namesrv_broker()
{
TAG_SUFFIX=$1
# Start nameserver
docker run -d -v `pwd`/data/namesrv/logs:/home/rocketmq/logs --name rmqnamesrv -p 9876:9876 apacherocketmq/rocketmq:4.5.0${TAG_SUFFIX} sh mqnamesrv
# Start Broker
docker run -d -v `pwd`/data/broker/logs:/home/rocketmq/logs -v `pwd`/data/broker/store:/home/rocketmq/store -v `pwd`/data/broker/conf/:/home/rocketmq/rocketmq-4.5.0/conf/ --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" -p 10909:10909 -p 10911:10911 -p 10912:10912 apacherocketmq/rocketmq:4.5.0${TAG_SUFFIX} sh mqbroker -c ../conf/broker.conf
}

if [ $# -lt 1 ]; then
echo -e "Usage: sh $0 BaseImage"
exit -1
fi

export BASE_IMAGE=$1

echo "Play RocketMQ docker image of tag 4.5.0-${BASE_IMAGE}"

RMQ_CONTAINER=$(docker ps -a|awk '/rmq/ {print $1}')
if [[ -n "$RMQ_CONTAINER" ]]; then
echo "Removing RocketMQ Container..."
docker rm -fv $RMQ_CONTAINER
# Wait till the existing containers are removed
sleep 5
fi

prepare_dir()
{
dirs=("data/namesrv/logs" "data/broker/logs" "data/broker/store")

for dir in ${dirs[@]}
do
if [ ! -d "`pwd`/${dir}" ]; then
mkdir -p "`pwd`/${dir}"
chmod a+rw "`pwd`/${dir}"
fi
done
}

prepare_dir

echo "Starting RocketMQ nodes..."

case "${BASE_IMAGE}" in
alpine)
start_namesrv_broker -alpine
;;
centos)
start_namesrv_broker
;;
*)
echo "${BASE_IMAGE} is not supported, supported base images: centos, alpine"
exit -1
;;
esac

注:標紅部分,需要提前設置持久化配置文件,文件為broker.conf,內容如下

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1 = 192.168.31.89 #物理ip,不能用127.0.0.1、localhost、docker內網ip

由於需要客戶端訪問docker搭建的rocketmq,根據官方https://github.com/apache/rocketmq-docker 的指引,本地搭建完成,並可以使用腳本跑通,但是客戶端訪問時報錯,RemotingConnectException: connect to <172.17.0.4:10909> failed,經確認客戶端也會訪問broker的容器,導致無法訪問,只能通過配置文件的brokerip1去設定

 

 6.執行命令 

./play-docker.sh alpine

執行完成后,docker ps可看到容器如下:

 

 7.成功啟動后,可執行templates目錄下的play-producer.sh play-consumer.sh腳本進行生產消費的測試驗證

8.創建一個可視化的控制台,執行命令如下:

docker run -d --name rmqconsole -p 8180:8080 --link rmqnamesrv:rmqnamesrv -e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -t styletang/rocketmq-console-ng

成功后可以看到相應的broker配置

 

 

 

9.設置一個測試用的topic,否則無法推送生產消息

 

 

10.使用官方提供的sample進行一個簡單的producer消息推送

public class SyncProducer {
public static void main(String[] args) throws Exception {
// 實例化消息生產者Producer
DefaultMQProducer producer = new DefaultMQProducer("group_name1");
// 設置NameServer的地址
producer.setNamesrvAddr("localhost:9876");
producer.setSendMsgTimeout(10000);
// 啟動Producer實例
producer.start();
// 創建消息,並指定Topic,Tag和消息體
Message msg = new Message("TopicTest",
"TagCCC",
("Hello RocketMQ ").getBytes(RemotingHelper.DEFAULT_CHARSET)
);
// 發送消息到一個Broker
SendResult sendResult = producer.send(msg);
// 通過sendResult返回消息是否成功送達
System.out.printf("%s%n", sendResult);
// 如果不再發送消息,關閉Producer實例。
producer.shutdown();
}
}

11.運行一次main方法,查看結果,idea中可以看到結果如下:

 

 rocketmq控制台可以看到結果如下:

 

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM