RabbitMQ

communication

# 一、RabbitMQ基础

RabbitMQ官网:https://www.rabbitmq.com/ (opens new window)

RabbitMQ是由ERlang语言开发的AMQP协议的消息队列。

AMQP Advanced Message Queuing Protocol 高级消息队列协议

# 1.1 RabbitMQ核心概念

1、Broker

消息队列服务器主机

2、Exchange

消息交换机,指定消息按照什么规则、发送到那个队列。

  • Exchange作用
    1. 接受生产者的消息;
    2. 负责向Queue进行消息投递;
  • Exchange类型
    1. 广播模式fanout):一条消息被所有消费者处理;
    2. 直连模式direct):生产者匹配消费者的Routing Key
    3. 主题模式topic):类似于fanoutdirect的整合,所有可以匹配生产者Routing Key 的消费者都可以接收到该主题消息。

3、Queue

消息对立载体,每个消息都会被投入一个或多个队列。

4、Binding

绑定,把ExchangeQueue按照路由规则进行绑定。

5、Routing Key

路由关键字,Exchange根据该关键字进行消息投递。

6、Vhost

虚拟主机,一个Broker可以设定多个Vhost,实现用户的权限隔离。

7、Channel

消息通道,在客户端每个连接中,可建立多个Channel(会话任务)。

8、Producer

消息生产者。

9、Consumer

消息消费者。

# 1.2 RabbitMQ工作模式

RabbitMQ 提供了 6 种工作模式:

工作模式 英文 描述
简单模式
工作队列模式 Work queues 一个生产者 -> 一个消息队列 -> 一个消费者
发布与订阅模式 Publish/Subscribe 一个生产者 -> 一个交换机 -> N个消息队列 -> N个消费者
路由模式 Routing 在发布订阅模式的基础上,增加了Routing Key
主题模式 Topics 在路由模式的基础上,增加了通配符的功能
远程调用模式 RPC 生产者 -> 交换机 -> 消息队列 -> 消费者 -> 返回状态消息给原有生产者

# 1.3 RabbitMQ端口说明

端口 说明
4369 Erlang发现口
5672 Client端通信口
15672 管理界面UI端口
25672 Server间内部通信口

举例说明:

​ 我们访问RabbitMQ管理界面可以访问如下:http://localhost:15672/ (opens new window)

​ 我们连接RabbitMQ的话就要用Client端通信口:server: amqp://guest:guest@localhost:5672/

# 1.4 RabbitMQ用户角色

RabbitMQ用户角色可分为五类:超级管理员, 监控者, 策略制定者, 普通管理者以及其他。

  1. 超级管理员(administrator)

    可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

  2. 监控者(monitoring)

    可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

  3. 策略制定者(policymaker)

    可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。

  4. 普通管理者(management)

    仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

  5. 其他

    无法登陆管理控制台,通常就是普通的生产者和消费者。

用户也可以同时具有多个角色。

# 二、RabbitMQ安装

# 2.1 Windows安装(3.10.x)

由于RabbitMQ是基于Erlang的,所以,在正式安装RabbitMQ之前,需要先安装一下Erlang。

RabbitMQ Erlang Version对应关系 (opens new window)

Github源码说明文档 (opens new window)

# 下载并安装Erlang

Erlang下载地址 (opens new window)

选择下载版本,进行安装,按照步骤默认安装即可。

配置环境变量:配置ERLANG_HOME环境变量,其值指向erlang的安装目录。

ERLANG_HOME
F:\Install_java\Erlang OTP
1
2

另外将 %ERLANG_HOME%\bin 加入到Path中。

检查安装是否成功:打开cmd,输入erl

# 下载并安装 MQ

RabbitMQ官网下载地址 (opens new window)

下载:选择Downloads on GitHub——Windows installer 进行下载。

安装:按照步骤默认安装即可。

安装可视化插件:CMD进入安装Rabbitmq的sbin目录,安装插件rabbitmq_management。

cd F:\Install_java\RabbitMQ3.10.6\rabbitmq_server-3.10.6\sbin
rabbitmq-plugins enable rabbitmq_management
1
2

启动RabbitMQ服务:搜索程序,直接执行启动。

登录:浏览器输入http://localhost:15672/

默认账户密码:guest/guest

# 用户设置

RabbitMQ的用户管理包括增加用户,删除用户,查看用户列表,修改用户密码。

新增用户

  • 可通过可视化UI界面进行添加用户。

  • 通过命令:

进入安装路径sbin目录:

# 查看已有用户及用户的角色:
rabbitmqctl.bat list_users
# 新增一个用户:
rabbitmqctl.bat add_user username password
# 修改密码
rabbitmqctl change_password userName newPassword
# 删除用户信息
rabbitmqctl.bat delete_user username
1
2
3
4
5
6
7
8

绑定角色

rabbitmqctl set_user_tags admin administrator
1

设置权限

rabbitmqctl set_permissions -p / aaa.*.*.*
1

查看rabbitmq相关命令的方法

# 查看rabbitmq所有命令
rabbitmqctl help
# 查看rabbitmq具体一个命令的描述, 比如add_user
rabbitmqctl help add_user
1
2
3
4

# 2.2 Docker安装(3.7.x)

下载镜像rabbitMQ-manager

docker pull rabbitmq:3.7.18-management
1

编写docker-compse.yml

mkdir -p /usr/local/docker/rabbitmq
cd /usr/local/docker/rabbitmq
vi docker-compose.yml
1
2
3
version: '3'
services: 
    rabbitmq: 
        restart: always
        image: rabbitmq:3.7.18-management
        container_name: rabbitmq_3.7.18-m
        environment: 
            RABBITMQ_DEFAULT_VHOST: my_vhost
            RABBITMQ_DEFAULT_USER: admin
            RABBITMQ_DEFAULT_PASS: admin
        ports: 
            - 5672:5672 
            - 15672:15672
        volumes: 
            - ./data:/var/lib/rabbitmq
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

登录RabbitMQ管理界面:http://localhost:15672 (opens new window)

admin/admin

# 2.3 延迟队列插件安装

RabbitMQ 实现了一个插件 x-delay-message 来实现延时队列,我们可以从 这里 (opens new window) 下载到它.

延迟队列插件下载 (opens new window)

  • 选择 rabbitmq_delayed_message_exchange 插件
  • 选择 .ez 格式的文件下载

# Windows安装

下载后放置 RabbitMQ 的安装目录下的 plugins 目录

sbin目录下执行命令

rabbitmq-plugins enable rabbitmq_delayed_message_exchange
1

完毕!

# Docker安装(3.10.x)

第一步:自建镜像rabbitmq: 3.10-management-delayed

  • 构建Dockerfile
# rabbitmq management delay
From rabbitmq:3.10-management
COPY rabbitmq_delayed_message_exchange-3.10.2.ez /plugins
RUN rabbitmq-plugins enable --offline rabbitmq_delayed_message_exchange
1
2
3
4
  • 上传rabbitmq_delayed_message_exchange-3.10.2.ez至Dockerfile同级目录;
  • 执行命令构建镜像;
docker build -t rabbitmq:3.10-management-delayed .
1

第二步:调整docker-compse.yml中的镜像版本为自建镜像。

  • 修改docker-compse.yml
version: '3.4'
services:
    rabbitmq:
        restart: always
        image: rabbitmq:3.10-management-delayed
        container_name: rabbitmq_3.10-m-delayed
        environment:
            RABBITMQ_DEFAULT_VHOST: /
            RABBITMQ_DEFAULT_USER: guest
            RABBITMQ_DEFAULT_PASS: guest
        ports:
            - 5672:5672
            - 15672:15672
        volumes:
            - ./data:/var/lib/rabbitmq
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 三、RabbitMQ FAQ

# Win安装使用guest账户报错

RabbitMQ默认提供了一个guest/guest用户,但是从3.3.0 版本以后该账号只能localhost登陆(User can only log in via localhost),解决办法就是我们通过命令行创建一个管理员账号。

通过以下命令创建一个用户admin,密码为admin@123。

rabbitmqctl add_user admin admin@123
1

创建完成之后通过以下命令设置用户标签为administrator。

rabbitmqctl set_user_tags admin administrator
1

给用户admin赋予权限,授予admin用户可访问虚拟主机 /,并在所有的资源上具备可配置、可写及可读的权限。

rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
1

这样我们就完成了一个用户的创建,通过以下命令可以看出当前的所有用户。

rabbitmqctl list_users
1

最后一步,我们就可以用admin登陆管理界面。