一、RabbitMQ 简介
RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
二、RabbitMQ 安装运行
- 安装依赖环境
- 安装 通用依赖
yum install -y autoconf
yum install -y ncurses-devel
- 安装erlang
wget https://github.com/erlang/otp/archive/OTP-22.2.tar.gz
tar -zvxf OTP-22.2.tar.gz
cd otp-OTP-22.2/
./otp_build autoconf
./configure
make
make install
- 安装 socat
sudo yum install -y socat
- 安装 RabbitMQ
- 下载
wget -P /home/download https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.23/rabbitmq-server-3.7.23-1.el7.noarch.rpm
可以在 https://github.com/rabbitmq/rabbitmq-server/tags 下载历史版本。
- 安装 RabbitMQ
sudo rpm -Uvh rabbitmq-server-3.7.23-1.el7.noarch.rpm
假如报版本错误,添加 --nodeps 参数,安装时不检查依赖关系。
- 启动和关闭
1.启动服务
sudo systemctl start rabbitmq-server
2.查看状态
sudo systemctl status rabbitmq-server
3.停止服务
sudo systemctl stop rabbitmq-server
4.设置开机启动
sudo systemctl enable rabbitmq-server
- 开启 Web 管理插件
- 见后面的笔记
- 设置防火墙
#开放端口
#需开放 4369、5672、25672、15672
sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent
#重启防火墙
sudo firewall-cmd --reload
三 、RabbitMQ 基本配置
- RabbitMQ 有一套默认的配置,能够满足日常开发需求,如果需要修改,需要自己创建一个配置文件
touch /etc/rabbitmq/rabbitmq.conf
- 配置文件示例
https://blog.csdn.net/qq_43681755/article/details/112171144- 配置项说明
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 插件启用的时候打开,作为 STOME 客户端端口(根据是否使用 TLS 选择)。 |
1883、8883 | 当 MQTT 插件启用的时候打开,作为 MQTT 客户端端口(根据是否使用 TLS 选择) |
15674 | 基于 WebSocket 的 STOMP 客户端端口(当插件 Web STOMP启用的时候打开)。 |
15675 | 基于 WebSocket 的 MQTT 客户端端口(当插件 Web MQTT 启用的时候打开)。 |
四、RabbitMQ 管理界面
- 启用 RabbitMQ 管理界面
#RabbitMQ 安装包中带有管理插件,但需要手动激活
rabbitmq-plugins enable rabbitmq_management
访问管理界面本机地址 端口为15672,账号密码默认都是:guest
RabbitMQ 有一个默认的用户“guest”,但这个用户默认只能通过本机访问,要让其他机器可以访问,需要创建一个新用户,为其分配权限。
#添加用户,后面两个参数分别是用户名和密码
rabbitmqctl add_user admin admin
#为用户分配权限,将用户设为管理员
rabbitmqctl set_user_tags admin administrator
# 为用户分配资源权限
abbitmqctl set_permissions -p / admin ".*" ".*" ".*"
使用新创建的用户进行访问
- RabbitMQ 的用户角色分类
none、management、policymaker、monitoring、administrator
none
不能访问 management plugin
management
1.用户可以通过 AMQP 做任何事情。
2.列出自己可以通过 AMQP 登入的 virtual hosts。
3.查看自己的 virtual hosts 中的 queues、exchanges、bindings。
4.查看和关闭自己的 channels 和 connections。
5.查看有关自己的 virtual hosts 的“全局”的统计信息,包含其他用户在这些 virtual hosts 中的活动。
policymaker
1.management 可以做的任何事情。
2.查看、创建和删除自己的 virtual hosts 所属的 policies 和 parameters。
monitoring
1.management 可以做的任何事情。
2.列出所有的 virtual hosts,包括他们不能登录的 virtual hosts。
3.查看其他用户的 connections 和 channels。
4.查看节点级别的数据如 clustering 和 memory 使用情况。
5.查看真正的关于所有 virtual hosts 的全局的统计信息。
administrator
1.policymaker 和 monitoring 可以做的任何事情。
2.创建和删除 virtual hosts
3.查看、创建和删除 users
4.查看、创建和删除 permissions
5.关闭其他用户的 connections
五、在 Java 中使用 RabbitMQ
- Maven 依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.8.0</version>
</dependency>
- Producer
/**
* 简单队列生产者
* 使用 RabbitMQ 的默认交换器发送消息
*/
public class Producer {
public static void main(String[] args) throws IOException, TimeoutException {
// 1. 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 2. 设置连接属性
factory.setHost("192.168.253.133");
factory.setUsername("admin");
factory.setPassword("admin");
Connection connection = null;
Channel channel = null;
try {
// 3. 从连接工厂获取连接
connection = factory.newConnection("生产者");
// 4. 从连接中创建通道
channel = connection.createChannel();
/**
* 5、声明(创建)队列
* 如果队列不存在,才会创建
* RabbitMQ 不允许声明两个队列名相同,属性不同的队列,否则会报错
*
* queueDeclare参数说明:
* @param queue 队列名称
* @param durable 队列是否持久化
* @param exclusive 是否排他,即是否为私有的,如果为true,会对当前队列加锁,其它通道不能访问,
* 并且在连接关闭时会自动删除,不受持久化和自动删除的属性控制。
* 一般在队列和交换器绑定时使用
* @param autoDelete 是否自动删除,当最后一个消费者断开连接之后是否自动删除
* @param arguments 队列参数,设置队列的有效期、消息最大长度、队列中所有消息的生命周期等等
*/
channel.