我是基于ChatGPT-turbo-3.5实现的AI助手,在此网站上负责整理和概括文章
本文介绍了如何使用 Docker Compose 快速部署 Apache RocketMQ 5.x 的单节点环境,并配置访问控制列表(ACL)以保障生产环境安全。文章首先概述了 RocketMQ 的核心组件(NameServer、Broker、Proxy、Dashboard),随后详细说明了单节点部署的步骤,包括配置目录、创建配置文件、编写 Docker-compose 文件以及运行容器。接着,文章展示了如何启用 ACL,包括配置 ACL 参数、创建 ACL 文件、挂载配置文件以及重启服务。最后,文章解释了 ACL 的相关参数及其含义,帮助用户理解权限管理机制。整个过程提供了详细的命令和配置示例,便于用户快速上手并应用于实际场景。
# 官网
官网:https://rocketmq.apache.org/
5.x 文档:https://rocketmq.apache.org/zh/docs/
4.x 文档:https://rocketmq.apache.org/zh/docs/4.x/
# 核心组件
| 组件 | 作用 | 端口 | 协议 |
|---|---|---|---|
| NameServer | 轻量级服务发现,管理 Broker 路由信息 | 9876 | HTTP |
| Broker | 消息存储和转发核心 | 10909, 10911, 10912 | 多种协议 |
| Proxy | 5.x 新增的轻量级代理层(可选) | 8080, 8081 | gRPC/HTTP |
| Dashboard | 可视化监控和管理 | 8080 | HTTP |
# 单节点部署
-
配置目录设置
mkdir -p ~/rocketmq/data/{logs,store} mkdir -p ~/rocketmq/conf chmod -R 777 ~/rocketmq/{data,conf}/ cd ~/rocketmq -
创建
config/broker.conf配置文storePathRootDir:指定了消息存储目录,与docker-compose.yml中的持久化卷路径一致。host.docker.internal是 Docker 提供的特殊 DNS 名称,指向宿主机(您的 Windows 机器)
# 创建新的配置文件 # 创建新的配置文件 cat > conf/broker.conf << EOF brokerClusterName=DefaultCluster # 节点名称 brokerName=broker-a # broker id节点ID, 0 表示 master, 其他的正整数表示 slave,不能小于0 brokerId=0 # nameServer 地址多个用;隔开 默认值null namesrvAddr=rmqnamesrv:9876 # Broker角色 brokerRole = ASYNC_MASTER # 刷盘方式 flushDiskType = ASYNC_FLUSH # 在每天的什么时间删除已经超过文件保留时间的 commit log,默认值04 deleteWhen = 04 # 以小时计算的文件保留时间 默认值72小时 fileReservedTime = 72 # 是否允许Broker 自动创建Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true # 是否允许Broker自动创建订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true # 必须修改存储路径为容器内路径 storePathRootDir=/home/rocketmq/store storePathCommitLog=/home/rocketmq/store/commitlog # Broker服务地址 内部使用填内网ip,如果是需要给外部使用填公网ip brokerIP1=host.docker.internal EOF -
在目目录下,创建一个
docker-compose.yml文件。这个文件将定义 RocketMQ 的 NameServer、Broker 和 Proxy 服务,以及它们之间的连接、数据持久化和权限配置。services: namesrv: image: apache/rocketmq:5.2.0 container_name: rmqnamesrv ports: - "9876:9876" volumes: - ./data/logs:/home/rocketmq/logs - ./data/store:/home/rocketmq/store command: sh mqnamesrv healthcheck: test: ["CMD", "nc", "-z", "localhost", "9876"] interval: 30s timeout: 10s retries: 3 networks: - rocketmq-net deploy: resources: limits: cpus: '0.5' # 限制使用 0.5 个 CPU 核心 memory: 800M # 限制使用 512MB 内存 reservations: cpus: '0.1' # 预留 0.1 个 CPU 核心 memory: 128M # 预留 128MB 内存 broker: image: apache/rocketmq:5.2.0 container_name: rmqbroker ports: - "10911:10911" - "10909:10909" volumes: - ./data/logs:/home/rocketmq/logs - ./data/store:/home/rocketmq/store - ./conf/broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf environment: - "JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn128m" - "JAVA_OPT=-Duser.home=/home/rocketmq" depends_on: - namesrv command: sh mqbroker -c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf healthcheck: test: ["CMD", "nc", "-z", "localhost", "10911"] interval: 30s timeout: 10s retries: 3 networks: - rocketmq-net deploy: resources: limits: cpus: '0.5' # 限制使用 0.5 个 CPU 核心 memory: 512M # 限制使用 512MB 内存 reservations: cpus: '0.1' # 预留 0.1 个 CPU 核心 memory: 128M # 预留 128MB 内存 mqadmin: image: apacherocketmq/rocketmq-dashboard:latest container_name: mqadmin ports: - "8080:8080" environment: JAVA_OPTS: "-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" depends_on: - namesrv - broker networks: - rocketmq-net deploy: resources: limits: cpus: '0.5' # 限制使用 0.5 个 CPU 核心 memory: 512M # 限制使用 512MB 内存 reservations: cpus: '0.1' # 预留 0.1 个 CPU 核心 memory: 128M # 预留 128MB 内存 networks: rocketmq-net: driver: bridge -
完成上述文件创建后,在项目根目录(包含
docker-compose.yml的目录)运行以下命令:# -d 参数表示在后台运行容器。 docker-compose up -d # 先停止旧容器,然后基于新的配置创建全新的容器 docker-compose up -d --force-recreate broker -
验证, 你应该看到
namesrv、broker和proxy容器都处于Up状态。# 查看容器状态: docker-compose ps
-
访问rocketmq-dashboard

# ACL
-
生产环境需要要启用 RocketMQ 的 ACL(访问控制列表)
-
在现有
broker.conf中添加 ACL 相关配置:brokerClusterName=DefaultCluster brokerName=broker-a brokerId=0 namesrvAddr=rmqnamesrv:9876 deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH # ACL 配置 aclEnable=true aclConfigPath=/home/rocketmq/rocketmq-5.2.0/conf/plain_acl.yml -
创建 ACL 配置文件,在本地
./conf目录下创建plain_acl.yml:
# 全局白名单 IP 地址,允许这些 IP 上的客户端在不提供凭证(accessKey 和 secretKey)的情况下访问。
# 多个 IP 可以用逗号分隔,或者作为列表项。
# 支持通配符,例如 10.10.15.*
globalWhiteRemoteAddresses:
- 10.10.15.*
- 192.168.0.*
accounts:
# 管理员账户(默认)
- accessKey: rocketmq2
secretKey: 12345678
whiteRemoteAddress:
admin: true
# 普通生产者/消费者账户
- accessKey: yourAccessKey
secretKey: yourSecretKey
whiteRemoteAddress:
defaultTopicPerm: DENY
defaultGroupPerm: SUB
topicPerms:
- topicA=DENY
- topicB=PUB|SUB
groupPerms:
- groupA=DENY
- groupB=SUB
-
修改 Docker Compose 挂载 ACL 配置
# 更新 broker 服务的 volumes 配置: broker: volumes: - ./data/logs:/home/rocketmq/logs - ./data/store:/home/rocketmq/store - ./conf/broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf - ./conf/plain_acl.yml:/home/rocketmq/rocketmq-5.2.0/conf/plain_acl.yml # 新增挂载 -
ACL开启后,再次访问会提示报错
Caused by: org.apache.rocketmq.client.exception.MQBrokerException: CODE: 1 DESC: org.apache.rocketmq.acl.common.AclException: No accessKey is configured, org.apache.rocketmq.acl.plain.PlainPermissionManager.validate(PlainPermissionManager.java:609) BROKER: host.docker.internal:10911 For more information, please visit the url, https://rocketmq.apache.org/docs/bestPractice/06FAQ
# Dashboard配置
-
Dashboard配置了ACL的AccessKey和SecretKey。
-Drocketmq.config.loginRequired=true开启登录页-Drocketmq.config.aclEnable=true-Drocketmq.config.accessKey=rocketmq2-Drocketmq.config.secretKey=12345678
mqadmin: image: apacherocketmq/rocketmq-dashboard:latest container_name: mqadmin ports: - "8080:8080" environment: - "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Drocketmq.config.accessKey=rocketmq2 -Drocketmq.config.secretKey=12345678" depends_on: - namesrv - broker networks: - rocketmq-net -
重启broker服务
# 先停止旧容器,然后基于新的配置创建全新的容器 docker-compose up -d --force-recreate broker docker-compose up -d --force-recreate mqadmin # 重启 docker compose down docker compose up -d
# plain_acl参数
| 字段 | 取值 | 含义 |
|---|---|---|
| globalWhiteRemoteAddresses | ;192.168..*;192.168.0.1 | 全局IP白名单 |
| accessKey | 字符串 | Access Key 用户名 |
| secretKey | 字符串 | Secret Key 密码 |
| whiteRemoteAddress | ;192.168..*;192.168.0.1 | 用户IP白名单 |
| admin | true;false | 是否管理员账户 |
| defaultTopicPerm | DENY;PUB;SUB;PUB|SUB | 默认的Topic权限 |
| defaultGroupPerm | DENY;PUB;SUB;PUB|SUB | 默认的ConsumerGroup权限 |
| topicPerms | topic=权限 | 各个Topic的权限 |
| groupPerms | group=权限 | 各个ConsumerGroup的权限 |
权限标识符的含义
| 权限 | 含义 |
|---|---|
| DENY | 拒绝 |
| ANY | PUB 或者 SUB 权限 |
| PUB | 发送权限 |
| SUB | 订阅权限 |