RabbitMQ 是什么
RabbitMQ
是一个开源的AMQP
实现,服务器端用Erlang
语言编写,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性
等方面表现不俗。
RabbitMQ 安装运行
一、安装依赖环境
-
在 http://www.rabbitmq.com/which-erlang.html 页面查看安装rabbitmq需要安装erlang对应的版本
-
在 https://github.com/rabbitmq/erlang-rpm/releases 页面找到需要下载的erlang版本,erlang-*.centos.x86_64.rpm就是centos版本的。
-
复制下载地址后,使用wget命令下载
wget -P /home/download https://github.com/rabbitmq/erlang-rpm/releases/download/v21.2.3/erlang-21.2.3-1.el7.centos.x86_64.rpm
4.安装 Erlang
sudo rpm -Uvh /home/download/erlang-21.2.3-1.el7.centos.x86_64.rpm
5.安装 socat
sudo yum install -y socat
二、安装RabbitMQ
1.在官方下载页面找到CentOS7版本的下载链接,下载rpm安装包
wget -P /home/download https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.9/rabbitmq-server-3.7.9-1.el7.noarch.rpm
提示
:可以在https://github.com/rabbitmq/rabbitmq-server/tags下载历史版本
2.安装RabbitMQ
sudo rpm -Uvh /home/download/rabbitmq-server-3.7.9-1.el7.noarch.rpm
三、启动和关闭
-
启动服务
sudo systemctl start rabbitmq-server
-
查看状态
sudo systemctl status rabbitmq-server
-
停止服务
sudo systemctl stop rabbitmq-server
-
设置开机启动
sudo systemctl enable rabbitmq-server
四、开启Web管理插件
- 开启插件
rabbitmq-plugins enable rabbitmq_management
说明:rabbitmq有一个默认的guest用户,但只能通过localhost访问,所以需要添加一个能够远程访问的用户。
- 添加用户
rabbitmqctl add_user admin admin
- 为用户分配操作权限
rabbitmqctl set_user_tags admin administrator
- 为用户分配资源权限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
五、防火墙添加端口
- RabbitMQ 服务启动后,还不能进行外部通信,需要将端口添加都防火墙
1.添加端口
sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent
sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent
2.重启防火墙
sudo firewall-cmd --reload
RabbitMQ 基本配置
RabbitMQ 配置
RabbitMQ有一套默认的配置,能够满足日常开发需求,如果需要修改,需要自己创建一个配置文件。
touch /etc/rabbitmq/rabbitmq.conf
配置文件示例:
https://github.com/rabbitmq/rabbitmq-server/blob/master/doce/rabbitmq.conf.example
配置项说明:
https://www.rabbitmq.com/configure.html#config-items
RabbitMQ 端口
RabbitMQ 会绑定一些端口,安装完后,需要将这些端口添加至防火墙。
- 4369
是Erlang的端口/结点名称映射程序,用来跟踪节点名称监听地址,在集群中起到一个类似DNS的作用。
- 5672,5671
AMQP 0-9-1 和 1.0 客户端端口,没有使用SSL和使用SSL的端口。
- 25672
用于RabbitMQ节点间和CLI工具通信,配合4369使用。
- 15672
HTTP_API端口,管理员用户才能访问,用于管理RabbitMQ,需要启用management插件。
- 61613,61614
当STOMP插件启用的时候打开,作为STOMP客户端端口(根据是否使用TLS选择)
- 1883,8883
当MQTT插件启用的时候打开,作为MQTT客户端端口(根据是否使用TLS选择)
- 15674
基于WebSocket的STOMP客户端端口(当插件Web STOMP启用的时候打开)
- 15675
基于WebSocket的MQTT客户端端口(当插件Web MQTT启用的时候打开)
RabbitMQ 管理界面
启用 RabbitMQ 管理界面
RabbitMQ 安装包中带有管理插件,但需要手动激活
rabbitmq-plugins enable rabbitmq_management
RabbitMQ 有一个默认的用户"guest",但这个用户默认只能通过本机访问,要让其他机器可以访问,需要创建一个新用户,为其分配权限。
#添加用户
rabbitmqctl add_user admin admin
#为用户分配权限
rabbitmqctl set_user_tags admin administrator
#为用户分配资源权限
rabbitmqctl set_permissions -p / admin ".*"".*"".*"
访问界面:IP:15672
密码:admin admin
RabbitMQ角色
RabbitMQ 的用户角色分类:none、management、policymaker、monitorimg、administrator
none
不能访问 management plugin
management
用户可以通过AMQP做的任何事外加:
- 列出自己可以通过AMQP登入的virtual hosts
- 查看自己的virtual hosts中的queues,exchanges和bindings
- 查看和关闭自己有关的channels和connections
- 查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动
policymaker
management可以做的任何事外加:
- 查看、创建和删除自己的virtual hosts所属的policies和parameters
monitoring
management可以做的任何事外加:
- 列出所有的virtual hosts,包括他们不能登录的virtual hosts
- 查看其他用户的connection和channels
- 查看节点级别的数据如clustering和memory使用情况
- 查看真正的关于所有virtual hosts的全局的统计信息
administrator
policymaker和monitoring可以做的任何事外加:
- 创建和删除virtual hosts
- 查看、创建和删除users
- 查看创建和删除permissions
- 关闭其他用户的connections
Hello World(使用)
在Java中使用RabbitMQ
Maven依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.5.1</version>
</dependency>
在Spring中使用RabbitMQ
Maven依赖
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-amqp</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
AMQP 协议
AMQP 是什么
AMQP(Advanced Messaged Queueing Protocol) 高级消息队列协议,是应用层协议的一个开放标准,为面对消息的中间件设计。
AMQP 结构
AMQP生产者流转过程
AMQP消费者流转过程
RabbitMQ 核心概念
RabbitMQ 整体结构
Producer
Producer
:生产者,就是投递消息的一方。生产者创建消息,然后发布到RabbitMQ 中。
消息一般可以包含两个部分: 消息体和附加消息。
- 消息体(payload)
在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如一个JSON字符串。当然可以进一步对这个消息体进行序列化操作。
- 附加信息
用来表述这条消息,比如目标交换器的名称、路由键和一些自定义属性 等等。
Broker
Broker
:消息中间件的服务节点。
对于RabbitMQ来说,一个RabbitMQ Broker可以简单地看作一个RabbitMQ服务节点,或者RabbitMQ服务实例。也可以将一个RabbitMQ Broker看作一台RabbitMQ服务器。
Virtual Host
Virtual Host
:虚拟主机,表示一批交换机、消息队列和相关对象。
虚拟主机是共享相同的身份认证和加密环境的独立服务器域。
每个 vhost 本质上就是一个mini版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。
vhost是AMQP概念的基础,必须在连接时指定,RabbitMQ默认的vhost是/。
Channel
Channel
: 频道或信道,是建立在Connection连接之上的一种轻量级的连接。
大部分的操作是在Channel这个接口中完成的,包括定义队列的声明queueDeclare、交换机的声明exchangeDeclare、队列的绑定queueBind、发布消息basicPublish、消费消息basicConsume等。
如果把Connection比作一条光纤电缆的话,那么Channel信道就比作成光纤电缆中的其中一束光纤。一个Connection上可以创建任意数量的Channel。
RoutingKey
RoutingKey
:路由键。生产者将消息发给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则。
RoutingKey需要与交换器类型和绑定键(BindingKey)联合使用
在交换器类型和绑定键(BindingKey)固定的情况下,生产者可以在发送消息给交换器时,通过指定RoutingKey来决定消息流向哪里。
Exchange
Exchange
:交换器,生产者将消息发送到 Exchange(交换器,通常也可以使用大写的“X”来表示),由交换器将消息路由到一个或者多个队列中。如果路由不到,或返回给生产者,或直接丢弃。
Queue
Queue
: 队列,是RabbitMQ的内部对象,用于存储消息。
Binding
Binding
:绑定,RabbitMQ 中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键(BindingKey),这样RabbitMQ就知道如何正确地将消息路由到队列了。
Exchange 类型
RabbitMQ常用的交换器类型有fanout
、direct
、topic
、headers
这四种。
fanout 扇型交换机
它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。
direct 直连交换机
它会把消息路由到那些 BindingKey 和 RoutingKey完全匹配的队列中
topic 主题交换机
与direct类似,但它可以通过通配符进行模糊匹配
headers 头交换机
不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配
headers类型的交换器性能很差,而且也不实用。
Consumer
Consumer
:消费者,就是接受消息的一方。消费者连接到 RabbitMQ 服务器,并订阅到队列上。
当消费者消费一条消息时,只是消费消息的消费体(payload)。在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者也只会消费到消费体,也就不知道消息的生产者是谁,当然消费者也不需要知道。
运转流程
RabbitMQ运转流程
生产者发送消息的过程
:
- 生产者连接到RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)
- 生产者声明一个交换器,并设置相关属性,比如 交换机类型、是否持久化等
- 生产者声明一个队列并设置相关属性,比如是否排他、是否持久化、是否自动删除等
- 生产者通过路由键将交换器和队列绑定起来
- 生产者发送消息至RabbitMQ Broker,其中包含路由键、交换器等信息
- 相应的交换器根据接收到的路由键查找相匹配的队列
- 如果找到,则将从生产者发送过来的消息存入相应的队列中
- 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者
- 关闭信道、关闭连接
消费者收到消息的过程
:
- 生产者连接到RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)
- 消费者向RabbitMQ Broker请求消费相应队列中的消息,可能会设置相应的回调函数,以及做一些准备工作
- 等待RabbitMQ Broker回应并投递相应队列中的消息,消费者接收消息
- 消费者确认(ack)接收到的消息
- RabbitMQ从队列中删除相应已经被确认的消息
- 关闭信道、关闭连接