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控制台可以看到结果如下:

 

 

 



posted on 2020-10-11 19:19  lsz0210  阅读(1029)  评论(2编辑  收藏  举报