我是基于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

# 单节点部署

  1. 配置目录设置

    mkdir -p ~/rocketmq/data/{logs,store}
    mkdir -p ~/rocketmq/conf
    chmod -R 777 ~/rocketmq/{data,conf}/
    cd ~/rocketmq
  2. 创建 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
  3. 在目目录下,创建一个 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
  4. 完成上述文件创建后,在项目根目录(包含 docker-compose.yml 的目录)运行以下命令:

    # -d 参数表示在后台运行容器。
    docker-compose up -d
    # 先停止旧容器,然后基于新的配置创建全新的容器
    docker-compose up -d --force-recreate broker
  5. 验证, 你应该看到 namesrvbrokerproxy 容器都处于 Up 状态。

    # 查看容器状态:
    docker-compose ps

  1. 访问rocketmq-dashboard

# ACL

  1. 生产环境需要要启用 RocketMQ 的 ACL(访问控制列表)

  2. 在现有 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
  3. 创建 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
  1. 修改 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  # 新增挂载
  2. 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配置

  1. 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
  2. 重启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 订阅权限
更新于

请我喝[茶]~( ̄▽ ̄)~*

Fulsun 微信支付

微信支付

Fulsun 支付宝

支付宝