但凡是亲自部署过 RocketMQ 的小伙伴估计都跟我有一样的感受,岂是一个坑字了得。
RocketMQ 的迭代不算快,但出乎意料的是不同的版本之间部署的方式又不大一样,你去上网查吧,大部分教程也没标注使用的是哪个版本。
作为技术博主,我对教程是有着强烈洁癖的,我认为一切不标注时效的教程都不是好教程。
正如你所看到的,我正写的保姆级部署教程是基于的 5.1.0 这个版本,来自未来的读者,我希望你在实践之前能和我的版本保持一致。
当然如果你是来自未来 2 年的读者,大概率请你不要参照我的教程,但其思想是可以长存的,不会随着时间的流逝而变成没有用的屁。
因大部分时候,我们学习环境都会搭建在本地环境,所以这其实更多是一篇单机版的部署教程,至于集群版本,我会再单独写一篇,毕竟更复杂嘛。
因 RocketMQ 天生的分布式组件,苍何建议大家都用 Docker 或者 Docker-Compose 部署,出问题了重建搞个镜像还很快。
由于我的电脑是 M 1 芯片,有一些个别的命令如果是 windows 需要调整下。
Docker 方式
通过 Docker 的方式简单高效,可以快速部署一个单节点单副本的 RocketMQ 服务。
拉取 RocketMQ 镜像
我拉取的是 dockerhub 上 RocketMQ 的镜像版本 5.1.0,请尽量保持版本和我的一致,否则会有意想不到的事情发生。
Java
代码解读
复制代码
docker pull apache/rocketmq:5.1.0
拉取成功后,可以看下本地镜像列表是否已有啦:
创建容器共享网络
为什么要创建 docker 共享网络?
- 容器间通信:创建一个 Docker 网络可以确保同一个网络中的容器可以通过容器名称进行通信,而不需要知道对方的 IP 地址。这对于需要相互通信的服务非常重要,比如 RocketMQ 的多个组件(如 NameServer 和 Broker)。
- 隔离性和安全性:Docker 网络提供了一个隔离的网络环境,不同网络中的容器彼此隔离。这增加了安全性,防止外部或其他不相关的容器访问敏感服务。
- 简化配置:使用 Docker 网络,配置变得更加简单。容器可以通过名称互相访问,无需担心容器重启后 IP 地址发生变化。
对于像 RocketMQ 这样的分布式系统,它包含多个服务(NameServer、Broker、Producer、Consumer 等),这些服务需要互相通信。创建一个共享网络使得这些服务可以轻松发现和通信。
创建容器共享网络命令:
Java
代码解读
复制代码
docker network create rocketmq
启动 NameServer
Java
代码解读
复制代码
# 启动NameServer(windows) docker run -d --name pmnamesrv -p 9876:9876 --net rocketmq apache/rocketmq:5.1.0 sh mqnamesrv # MAC,需要指定平台 docker run --platform linux/amd64 -d --name pmnamesrv -p 9876:9876 --net rocketmq apache/rocketmq:5.1.0 sh mqnamesrv # 验证NameServer是否启动成功 docker logs -f pmnamesrv
我们可以看到 'The Name Server boot success..', 表示NameServer 已成功启动。
启动 Broker+proxy
NameServer成功启动后,我们启动Broker 和 proxy。5.0+版本以上需要启动代理组件。
先配置 Broker 的 IP 地址(需要自己 查 IP 地址):
Java
代码解读
复制代码
# 配置 Broker 的 IP 地址 echo "brokerIP1=192.168.200.47" >broker.conf
这样会在你的终端所在目录下生成 broker.conf 配置文件,里面只有一串内网络配置的内容。(注意这里 127.0.0.1 要修改为共享网络 pmbroker )
当然了,也可以添加一些默认配置进去:
Java
代码解读
复制代码
brokerClusterName = DefaultCluster brokerName = broker brokerId = 0 deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH # 你的本机ip, 注意不要写localhost,127.0.0.1等,因为这是放到docker容器中的,我们需要指向mac本机 brokerIP1 = 192.168.200.47 # 禁用 tsl tlsTestModeEnable = false
复制 broker.conf 所在路径并填入启动程序中:
启动 Broker 和 Proxy:
如果不是 MAC ,去掉--platform linux/amd64
bash
代码解读
复制代码
# 启动 Broker 和 Proxy docker run --platform linux/amd64 -d \ --name pmbroker \ --network rocketmq \ -p 10912:10912 -p 10911:10911 -p 10909:10909 \ -p 8080:8080 -p 8081:8081 \ -e "NAMESRV_ADDR=pmnamesrv:9876" \ -v /Users/canghe/tools/rocketmq/broker.conf:/home/rocketmq/rocketmq-5.1.0/conf/broker.conf \ -v /Users/canghe/tools/rocketmq/data:/home/rocketmq/store \ apache/rocketmq:5.1.0 sh mqbroker --enable-proxy \ -c /home/rocketmq/rocketmq-5.1.0/conf/broker.conf # 验证 Broker 是否启动成功 docker exec -it pmbroker bash -c "tail -n 10 /home/rocketmq/logs/rocketmqlogs/proxy.log"
下面是启动具体的解释,需要根据自身情况做简单的修改哦:
Java
代码解读
复制代码
# 启动一个 Docker 容器,并在后台运行 docker run -d \ # 容器名称为 rmqbroker --name rmqbroker \ # 使用名为 rocketmq 的 Docker 网络 --network rocketmq \ # 映射容器的端口到主机的端口 # 10912:10912 - RocketMQ 内部通信端口 # 10911:10911 - RocketMQ 内部通信端口 # 10909:10909 - RocketMQ 内部通信端口 # 8080:8080 - RocketMQ 控制台端口 # 8081:8081 - RocketMQ 控制台端口 -p 10912:10912 -p 10911:10911 -p 10909:10909 \ -p 8080:8080 -p 8081:8081 \ # 设置环境变量 NAMESRV_ADDR,指定 NameServer 的地址 -e "NAMESRV_ADDR=rmqnamesrv:9876" \ # 将主机上的 broker.conf 文件挂载到容器内的指定路径 -v ./broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf \ # 数据持久化,防止重启容器数据丢失 -v /Users/canghe/tools/rocketmq/data:/home/rocketmq/store \ # 使用 RocketMQ 5.2.0 镜像 apache/rocketmq:5.2.0 \ # 在容器内执行 mqbroker 命令,并启用代理功能 sh mqbroker --enable-proxy \ # 指定 Broker 的配置文件路径 -c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf
搭建可视化控制台
前面 NameServer 和 Broker 搭建完成之后,就可以用来收发消息了,但是为了更加直观,可以搭建对应的服务控制台。在页面上直观看数据。
这里我直接选用 docker 方式安装 dashboard 控制台。
Java
代码解读
复制代码
# 拉取镜像 docker pull apacherocketmq/rocketmq-dashboard:latest # 启动容器 docker run -d --name rocketmq-dashboard --net rocketmq -e "JAVA_OPTS=-Drocketmq.namesrv.addr=pmnamesrv:9876" -p 8081:8080 -t apacherocketmq/rocketmq-dashboard:latest # 启动容器,mac芯片 docker run --platform linux/amd64 -d --name rocketmq-dashboard --net rocketmq -e "JAVA_OPTS=-Drocketmq.namesrv.addr=pmnamesrv:9876" -p 8082:8080 -t apacherocketmq/rocketmq-dashboard:latest
bash
代码解读
复制代码
# 启动容器,mac芯片 docker run --platform linux/amd64 -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=127.0.0.1:9876" -p 8082:8080 -t apacherocketmq/rocketmq-dashboard:latest
谷歌浏览器访问控制台:http://localhost:8082/
提示:大概要等几分钟控制台才有页面出现!
至此,Rocketmq 的安装启动就完成啦,比较麻烦,很吃版本,所以咱们一定要亲自动手操作才行哦。
Docker-compose 方式
妈呀,Docker-compose 又是个啥子?别害怕,如果你有仔细看过我们的教程的话应该不会陌生,这玩意无非就是能够编排容器,也就是说像我们上一步的 docker 启动多个容器,还是有顺序的,用 Docker-compose 就再适合不过了。
来吧,教程奉上,就三步哦,贼简单:
新建响应目录
电脑找个空的地方新建个文件夹,就叫 rocketmq 吧
然后新建 broker 目录,里面建 broker.conf,用来存放 broker 挂载配置,配置如下:
shell
代码解读
复制代码
brokerClusterName = DefaultCluster brokerName = broker brokerId = 0 deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH # 你的本机ip, 注意不要写localhost,127.0.0.1等,因为这是放到docker容器中的,我们需要指向mac本机 brokerIP1 = 192.168.200.47 # 禁用 tsl tlsTestModeEnable = false
之后在rocketmq 新建 data 文件夹,用来存放持久化数据,防止容器重启数据丢失。
新建 docker-compose 文件夹,里面新建文件 docker-compose.yml 文件。目录结构如下:
新建docker-compose.yml
这个就是 docker-compose 最重要的启动文件了,复制以下配置,具体目录修改为自己对应的目录即可,够简单吧,哈哈,这个地方其实苍何遇到 了不少坑,主要是 rocketmq 的官网太辣鸡了,社区也文档也不够多,需要自己琢磨的。
yaml
代码解读
复制代码
version: '3.8' services: namesrv: image: apache/rocketmq:5.1.0 container_name: rocketmq-pmnamesrv command: sh mqnamesrv networks: - rocketmq ports: - "9876:9876" broker: image: apache/rocketmq:5.1.0 container_name: rocketmq-pmbroker command: sh mqbroker -n namesrv:9876 -c /home/rocketmq/rocketmq-5.1.0/conf/broker.conf ports: - "10911:10911" - "10909:10909" - "10912:10912" depends_on: - namesrv networks: - rocketmq volumes: - /Users/canghe/tools/rocketmq/broker/broker.conf:/home/rocketmq/rocketmq-5.1.0/conf/broker.conf - /Users/canghe/tools/rocketmq/data:/home/rocketmq/store proxy: image: apache/rocketmq:5.1.0 container_name: rocketmq-pmproxy networks: - rocketmq depends_on: - broker - namesrv ports: - 8080:8080 - 8081:8081 restart: on-failure environment: - NAMESRV_ADDR=rocketmq-pmnamesrv:9876 command: sh mqproxy dashboard: image: apacherocketmq/rocketmq-dashboard:latest container_name: rocketmq-dashboard environment: - JAVA_OPTS=-Drocketmq.namesrv.addr=rocketmq-pmnamesrv:9876 ports: - "8082:8080" networks: - rocketmq depends_on: - namesrv - broker - proxy networks: rocketmq: driver: bridge
一键启动
以下几个命令就可以手到擒来了:
yaml
代码解读
复制代码
# 一键启动 docker-compose up -d # 一键停止所有容器 docker-compose stop # 一键删除所有容器 docker-compose rm # 一键查看所有启动的容器 docker-compose ps
如果一切都没问题,你可以看到如下信息:
这个时候你只需要小手打开下浏览器,输入;http://localhost:8082/
就可以看到如下界面啦:
好啦,有关 RocketMQ 的本地保姆级部署教程就到这里啦,有疑惑和问题欢迎大家留言讨论。