【RabbitMQ】docker-compose编排部署RabbitMQ容器——CentOS
一、介绍
本文介绍通过编写docker-compose.yml文件,在linux系统上部署RabbitMQ容器,实现在Windows系统上的访问RabbitMQ控制台界面,下面将介绍详细步骤。
本文使用CentOS 7系统,MobaXterm连接虚拟机。
二、步骤
1. 创建配置目录和数据存储目录
mkdir -p /opt/rabbitmq/conf /opt/rabbitmq/data
-p表示递归创建,父目录不存在则自动创建
2. 切换到rabbitmq目录
cd /opt/rabbitmq
3. 在rabbitmq目录下创建docker-compose文件
touch docker-compose.yml
4. 编辑docker-compose.yml文件
vi docker-compose.yml
按下i 或 o 或 s 或 a 或 insert 进入编辑模式:(编写以下命令)
version: '3.7' # 文件格式版本services: # 服务列表rabbitmq: # 服务名称image: rabbitmq:3-management # 官方镜像container_name: rabbitmq # 容器名称restart: unless-stopped # 退出重启,开机自启ports:- "5672:5672" # AMQP- "15672:15672" # 管理控制台- "1883:1883" # MQTT- "61613:61613" # STOMPvolumes:- ./data:/var/lib/rabbitmq- ./conf:/etc/rabbitmqenvironment:RABBITMQ_DEFAULT_USER: admin # 用户名RABBITMQ_DEFAULT_PASS: StrongPassword! # 密码RABBITMQ_DEFAULT_VHOST: / #默认虚拟主机路径(/ 表示根)healthcheck:test: ["CMD", "rabbitmq-diagnostics", "ping"]interval: 30stimeout: 10sretries: 5command: >bash -c "rabbitmq-plugins enable --offline rabbitmq_mqtt rabbitmq_stomp rabbitmq_web_stomp &&rabbitmq-server"
按 Esc 键 输入 :wq 按回车键,保存并退出
数 据 卷 挂 载 ( 持 久 化 )
- ./data:/var/lib/rabbitmq: 容器内 RabbitMQ 数据目录挂载到宿主机
./data
,保证容器删除后数据不丢失。 - ./conf:/etc/rabbitmq: 挂载配置目录,可放
rabbitmq.conf
等自定义配置文件。
健 康 检 查
- test: 执行
rabbitmq-diagnostics ping
检查 RabbitMQ 是否正常运行 - interval: 每 30 秒执行一次健康检查
- timeout: 检查超时时间 10 秒
- retries: 连续失败 5 次后,容器标记为
unhealthy
启 动 命 令
- rabbitmq-plugins enable --offline ...: 启动前启用 MQTT、STOMP、Web STOMP 插件(
--offline
表示在服务未启动时启用) - rabbitmq-server: 启动 RabbitMQ 服务
5. 启动docker.compose.yml文件
docker-compose up -d
-d 表示后台运行容器
6. 查看状态和日志
查看容器状态:
docker-compose ps
一次性显示日志:
docker-compose logs
实时跟踪(Ctrl+C退出):
docker-compose logs -f
7. 启用rabbitmq_management插件
启用后即可正常访问控制台
docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management
查看插件列表:
docker exec -it rabbitmq rabbitmq-plugins list
三、最终效果
在windows浏览器访问15672端口,登录rabbitMQ控制台界面
输入docker-compose.yml里设置的用户名和密码后,点击Login登录:
------ 成功进入RabbitMQ管理页面!!!------
/opt/rabbitmq/conf目录下的enabled_plugins文件包含了启用的插件名:
根目录 /opt/rabbitmq/data:
.erlang.cookie
:这是一个至关重要的文件,用于 Erlang 节点之间的认证。RabbitMQ 是基于 Erlang 开发的,Erlang 集群中的各个节点通过交换这个 cookie 来进行身份验证, 以确保只有授权的节点可以相互通信。在构建 RabbitMQ 集群时,集群内所有节点的.erlang.cookie
文件内容必须完全一致,否则节点间无法建立连接。mnesia
:Mnesia 是 Erlang 的分布式数据库管理系统,RabbitMQ 使用它来存储各种内部状态信息和配置数据。进入mnesia
子目录,里面的内容进一步细分:rabbit@<node_name>-plugins-expand
目录:其中<node_name>
是 RabbitMQ 节点的名称(如rabbit@535452ae251a
),该目录存储了已启用插件的扩展信息,比如插件展开后的文件、资源等,这些信息用于支持插件的正常运行。rabbit@<node_name>
目录:存放了与 RabbitMQ 节点相关的核心数据,包括队列、交换器、绑定关系、用户权限、虚拟主机等配置信息的持久化数据。在集群环境下,这些数据会根据配置在节点间进行同步,以保证集群状态的一致性。rabbit@<node_name>.pid
文件:记录了 RabbitMQ 节点对应的 Erlang 虚拟机进程 ID(PID)。通过这个文件,系统可以追踪和管理 RabbitMQ 进程,在进行进程相关的操作(如重启、停止)时起到关键作用。rabbit@<node_name>-feature_flags
文件:存储了 RabbitMQ 节点的功能标志信息,这些标志用于控制 RabbitMQ 的一些特性和功能的开启或关闭,例如某些实验性的功能或者特定版本引入的新特性的开关状态。
四、RabbitMQ 介绍
RabbitMQ 是一个开源的消息代理软件(也可称为消息队列中间件),它实现了高级消息队列协议(AMQP),同时也支持 STOMP、MQTT 等多种消息协议,在分布式系统中用于处理消息通信,以实现应用程序之间的解耦、异步通信和流量削峰。
1. 基本概念
- 消息队列:RabbitMQ 的核心是消息队列,它是一种数据结构,用于存储消息。消息生产者将消息发送到队列中,而消息消费者从队列中获取消息进行处理。队列可以有多个消费者,支持多种消费模式,比如一个消息只被一个消费者处理(竞争消费),或者多个消费者都能处理同一个消息(发布 - 订阅模式)。
- 生产者和消费者:生产者是产生消息的应用程序,它将消息发送到 RabbitMQ 服务器中的队列;消费者是接收并处理消息的应用程序,从队列中获取消息并进行相应的业务逻辑处理。
- 交换器(Exchange):生产者并不直接将消息发送到队列,而是发送到交换器。交换器根据特定的路由规则(如根据消息的路由键),将消息路由到一个或多个队列中。常见的交换器类型有:
- Direct 交换器:根据消息的路由键(Routing Key)精确匹配,将消息路由到绑定的队列。
- Fanout 交换器:不处理路由键,将接收到的消息广播到所有绑定的队列。
- Topic 交换器:根据路由键和绑定键进行模糊匹配,使用通配符(如 * 表示匹配一个单词,# 表示匹配零个或多个单词)来路由消息。
- Headers 交换器:根据消息的头部属性进行路由,但在实际应用中使用较少。
2. 工作原理
- 消息发送流程:生产者将消息发送到指定的交换器,交换器根据其类型和绑定规则,决定将消息路由到哪些队列。如果交换器无法将消息路由到任何队列(例如路由键不匹配),根据配置,消息可能会被丢弃或者发送到死信队列(Dead Letter Queue,DLQ)。
- 消息接收流程:消费者与 RabbitMQ 服务器建立连接并订阅队列,当队列中有新消息时,RabbitMQ 会将消息推送给消费者(推送模式),或者消费者主动从队列中拉取消息(拉取模式) 。消费者处理完消息后,可以向 RabbitMQ 发送确认信息(ACK),表示消息已成功处理,RabbitMQ 才会从队列中删除该消息;如果消费者在处理消息过程中出现异常未发送 ACK,RabbitMQ 会根据配置决定是否重新将消息发送给其他消费者或重新放回队列等待下次处理。
3. 特性和优势
- 多语言支持:RabbitMQ 支持多种编程语言,如 Python、Java、C#、JavaScript、Go 等,方便不同技术栈的开发团队使用。
- 高可靠性:提供了消息持久化机制,可将队列、交换器和消息等数据存储到磁盘,确保在服务器重启后消息不会丢失。同时支持发布确认(Publisher Confirms)和事务机制,保证消息可靠地发送到服务器。
- 灵活的路由机制:丰富的交换器类型和灵活的路由规则,能满足各种复杂的业务场景下的消息路由需求。
- 集群和高可用:可以轻松构建 RabbitMQ 集群,实现负载均衡和高可用性。通过镜像队列机制,可将队列复制到多个节点上,当某个节点出现故障时,其他节点可以继续提供服务,保障消息的正常收发。
- 插件系统:拥有强大的插件系统,通过安装插件可以扩展其功能,例如管理界面插件(提供可视化的管理控制台)、消息追踪插件、Prometheus 监控插件等。
4. 应用场景
- 异步处理:在电商系统中,用户下单后,可能需要发送短信通知、更新库存、记录订单日志等多个操作。使用 RabbitMQ 可以将这些操作异步化,将相关消息发送到队列,由对应的消费者去处理,从而提高系统的响应速度和吞吐量。
- 系统解耦:在一个大型微服务架构中,各个服务之间通过消息队列进行通信。例如,订单服务和支付服务之间,订单服务创建订单后将消息发送到 RabbitMQ,支付服务从队列中获取消息进行支付处理,这样两个服务之间不需要直接耦合,降低了系统的复杂度,提高了系统的可维护性和扩展性。
- 流量削峰:在秒杀、抢购等活动场景中,短时间内会有大量的请求涌入。通过 RabbitMQ 可以将请求放入队列,消费者按照一定的速度从队列中获取请求进行处理,避免了瞬间高流量对系统造成的冲击,保护了后端服务。
- 日志处理:将应用程序产生的日志消息发送到 RabbitMQ 队列,然后由专门的日志处理服务从队列中消费日志消息,进行存储、分析等操作,实现日志的集中管理和异步处理。