RabbitMQ消息队列

什么是RabbitMQ?

RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在不同的应用之间共享数据(跨平台跨语言)。RabbitMQ是使用Erlang语言编写,并且基于AMQP协议实现。

特点:

  • 可靠性:使用了一些机制来保证可靠性,比如持久化、传输确认、发布确认。
  • 灵活的路由:在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,Rabbit已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。
  • 消息集群:多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
  • 高可用:队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  • 多种协议:支持多种消息队列协议,如STOMP、MQTT等。
  • 多种语言客户端:几乎支持所有常用语言,比如Java、.NET、Ruby等。
  • 管理界面:提供了易用的用户界面,使得用户可以监控和管理消息Broker的许多方面。
  • 跟踪机制:如果消息异常,RabbitMQ提供了消息的跟踪机制,使用者可以找出发生了什么。
  • 插件机制:提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件。

TOC

一、安装部署RabbitMQ

★准备工作★

准备全部使用docker进行部署单机和群集模式
使用docker镜像:rabbitmq:3.11-management

rabbitmq单机部署

1.首先先创建所需要的docker网络

docker network create -d bridge rabbitmq

2.编写docker compose文件并启动

# docker-compose.yaml
version: '3.8'

services:
  rabbitmq:
    image: rabbitmq:3.11-management
    container_name: rabbitmq
    hostname: rabbitmq
    restart: unless-stopped
    privileged: true
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin123
    ports:
      - 15672:15672
      - 5672:5672
      - 25672:25672
    volumes:
      - ./data:/var/lib/rabbitmq
      - ./config:/etc/rabbitmq


networks:
  default:
    name: rabbitmq
    external: true

启动rabbitmq:

docker compose up -d
# 查看启动状态
docker compose ps
NAME       IMAGE                      COMMAND                   SERVICE    CREATED         STATUS         PORTS
rabbitmq   rabbitmq:3.11-management   "docker-entrypoint.s…"   rabbitmq   8 minutes ago   Up 8 minutes   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp, 15691-15692/tcp, 0.0.0.0:25672->25672/tcp, :::25672->25672/tcp

注意:如果不安装插件则无法页面访问管理界面!!!
进入rabbitmq容器安装管理所需插件:

# 进入容器
docker compose exec -it rabbitmq bash
root@rabbitmq:/# rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@rabbitmq:
rabbitmq_management
The following plugins have been configured:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch
Applying plugin configuration to rabbit@rabbitmq...
The following plugins have been enabled:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch

started 3 plugins.

测试阶段

这里docker部署把端口映射到了本地的15672端口,则访问http://127.0.0.1:15672即可(如下图所示)
rabbitmq.001
输入账户密码即可进入(如下图所示)
rabbitmq.002
上面可以看到节点信息,这样说明了rabbitmq搭建部署成功!!!

rabbitmq群集部署

1.配置群集的配置文件

该文件在容器中的目录位置:/etc/rabbitmq/rabbitmq.conf
该配置文件用于配置rabbitmq各种参数等信息,位于config配置文件目录下。
三个节点的配置文件一致即可,配置文件如下:

vim rabbitmq.conf
----------------------------------------
loopback_users.guest = false
listeners.tcp.default = 5672
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-server1
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-server2
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-server3

2.编辑.erlang.cookie文件

该文件在容器中的目录位置:/var/lib/rabbitmq/.erlang.cookie
该文件用于存放群集之间的验证的key,位于data数据目录下,该文件内容应该是一个长度为32的字符串,这个字符串在所有需要相互通信的节点之间应该是一致的。

vim .erlang.cookie
---------------------------
HYDFHVOATOAVGFRBFFNP

3.编写docker compose文件

把刚刚编写的两个文件挂载到对应目录下。
docker compose文件如下:

# docker-compose.yaml
version: '3.8'

services:
  rabbitmq-server1:
    image: rabbitmq:3.11-management
    container_name: rabbitmq1
    hostname: rabbitmq-server1
    restart: unless-stopped
    privileged: true
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin123
    ports:
      - 15671:15672
      - 5671:5672
      - 25671:25672
    volumes:
      - ./server1/data:/var/lib/rabbitmq
      - ./server1/config:/etc/rabbitmq
      - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro

  rabbitmq-server2:
    image: rabbitmq:3.11-management
    container_name: rabbitmq2
    hostname: rabbitmq-server2
    restart: unless-stopped
    privileged: true
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin123
    ports:
      - 15672:15672
      - 5672:5672
      - 25672:25672
    volumes:
      - ./server2/data:/var/lib/rabbitmq
      - ./server2/config:/etc/rabbitmq
      - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro

  rabbitmq-server3:
    image: rabbitmq:3.11-management
    container_name: rabbitmq3
    hostname: rabbitmq-server3
    restart: unless-stopped
    privileged: true
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin123
    ports:
      - 15673:15672
      - 5673:5672
      - 25673:25672
    volumes:
      - ./server3/data:/var/lib/rabbitmq
      - ./server3/config:/etc/rabbitmq
      - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro

networks:
  default:
    name: rabbitmq
    external: true

进行启动并跟单节点一样需要安装插件

# 启动服务
docker compose up -d
# 安装插件
docker compose exec -it rabbitmq-server1 rabbitmq-plugins enable rabbitmq_management
docker compose exec -it rabbitmq-server2 rabbitmq-plugins enable rabbitmq_management
docker compose exec -it rabbitmq-server3 rabbitmq-plugins enable rabbitmq_management

测试阶段

访问任一节点的15672的映射端口即可
rabbitmq.003
这样说明了rabbitmq群集搭建成功!!!