携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
RabbitMQ简介
AMQP(即Advanced Message Queuing Protocol,高级消息队列协议),是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面的表现十分全面。
RabbitMQ提供了可靠的消息机制、跟踪机制和灵活的消息路由,支持消息集群和分布式部署。适用于排队算法、秒杀活动、消息分发、异步处理、数据同步、处理耗时任务、CQRS等应用场景。
下面进行RabbitMQ的下载、安装和配置:
安装Erlang
下载
可以在Erlang的官方网站下载Windows最新版本的Erlang安装程序,OTP 23.2 Windows 64-bit Binary File:
配置环境变量
安装完成后配置环境变量:
验证
配置完环境变量后,win + R 运行cmd,打开命令行,输入erl,回车
出现类似Eshell V10.0.1 (abort with ^G)的字样,说明配置成功。
使用测试
1、输入1 + 1 . 注意要加上 . (英文句号-半角),再输入回车,出现结果2
2、输入“Hello World”,再输入回车,出现结果“Hello World”
按crtl+c退出Eshell
安装RabbitMQ
在搭建RabbitMQ环境过程中,如果RabbiteMQ与Erlang版本不一致会导致环境搭建出问题(爬过坑了😩)。
版本兼容问题
以下是RabbitMQ与Erlang的版本对应关系:
| RabbitMQ版本 | 最低要求的Erlang / OTP** | 最大支持的Erlang / OTP | 笔记 |
|---|---|---|---|
| 3.8.9(最新) | 22.3 | 23.x | Erlang / OTP 23兼容性说明 推荐使用Erlang 23.x Erlang 22.x不再支持HiPE |
| 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 | 21.3 | 23.x | Erlang / OTP 23兼容性说明 建议使用Erlang 22.x或23.x Erlang 22.x不再支持HiPE |
| 3.8.3 3.8.2 3.8.1 3.8.0 | 21.3 | 22.x | 建议使用Erlang22.x。 Erlang 22.x不再支持HiPE |
| 3.7.27 3.7.26 3.7.25 3.7.24 3.7.23 3.7.22 3.7.21 3.7.20 3.7.19 | 21.3 | 22.x | 不再支持Erlang / OTP 20.x Erlang 22.x不再支持HiPE |
| 3.7.18 3.7.17 3.7.16 3.7.15 | 20.3 | 22.x | Erlang / OTP 22.0兼容性说明 默认情况下,在Erlang 22.x上禁用TLSv1.0和TLSv1.1支持 |
| 3.7.14 3.7.13 3.7.12 3.7.11 | 20.3 | 21.x | 不再支持Erlang / OTP 19.x 为了获得最佳的TLS支持,建议使用最新版本的Erlang / OTP 21.x |
| 3.7.10 3.7.9 3.7.8 3.7.7 | 19.3 | 21.x | Erlang / OTP 21.0兼容性说明 |
| 3.7.6 3.7.5 3.7.4 3.7.3 3.7.2 3.7.1 3.7.0 | 19.3 | 20.x | 为了获得最佳的TLS支持,建议使用最新版本的Erlang / OTP 20.x 19.3.6.4之前的Erlang版本具有已知的错误(例如ERL-430和ERL-448),可以阻止RabbitMQ节点接受连接(包括来自CLI工具的连接)并停止 19.3.6.4之前的版本容易受到ROBOT攻击(CVE-2017-1000385) 在Windows上,Erlang / OTP 20.2更改了默认cookie文件位置 |
根据经验,建议每个受支持的Erlang / OTP系列的最新次要版本和修补程序版本。
下载
可以在RabbitMQ的官方网站下载最新版本的RabbitMQ服务器安装程序,RabbitMQ下载地址, 这里我下载的是官方推荐的最新版本rabbitmq-server-3.8.9.exe, 然后点击默认安装。
**注意:必须使用==管理帐户==**来安装Erlang,否则RabbitMQ Windows服务将无法发现它。
一旦安装了受支持的Erlang版本,请下载RabbitMQ安装程序rabbitmq-server- {version} .exe 并运行它。它将RabbitMQ安装为Windows服务,并使用默认配置启动它。
RabbitMQ安装步骤与Erlang差不多,当RabbitMQ安装时会请求授权与Erlang进行网络通信(因为RabbitMQ是基于Erlang开发 的)。
安装完成后,RabbitMQ是作为windows service 运行在后台!
设置环境变量
首先在系统变量(用户变量中不能引入到系统变量里)里添加一个RABBITQM_SERVER变量:
然后在系统的path变量中配置如下:
这样就可以在windows administrator启动的CMD窗口操控RabbitMQ服务了,不需要每次都定位到执行目录。
验证
运行服务:
1、执行rabbitmq命令行工具(rabbitmqctl ):
rabbitmqctl -q status //打印了一些rabbitmq服务状态信息,包括内存,硬盘,和使用erlong的版本信息
rabbitmq-server start //开启rabbitmq服务
rabbitmq-server stop //关闭rabbitmq服务
rabbitmqctl list_queues //查看所有队列消息
**注意:**只要开启了RabbitMQ服务,那么对应的http://localhost:15672端口就会自动打开,可以直接在浏览器中输入以上地址访问验证RabbitMQ是否安装成功!
扩展
——参考自《Windows上的RabbitMQ官网安装指南》
如果没有配置环境变量,可以cd到RabbitMQ安装目录下的/sbin目录;然后采用(默认的)宾客身份以CLI命令运行验证基本的运行情况,并显示有关该节点(如果正在运行)的一些信息。
#对节点和CLI工具的连接/身份验证
abbitmqctl.bat status
为了使其正常工作,必须满足两个条件:
- 该节点必须正在运行
- rabbitmqctl.bat必须能够通过该节点进行身份验证
默认用户访问
该协议(Broker)将创建一个用户来宾与密码 客人。未配置的客户端通常将使用这些凭据。**默认情况下,仅当以本地主机身份连接到代理时,才可以使用这些凭据,**因此您需要在从任何其他计算机连接之前采取措施。
请参阅访问控制文档,以获取有关如何创建更多用户和删除来宾用户的信息。
可视化界面配置
1. 安装rabbitmq管理工具(图形化工具)
我们用命令查看一下RabbtitMQ的所有插件:
C:\WINDOWS\system32>rabbitmq-plugins list // 查看所有插件
看到RabbtitMQ罗列出来了很多插件:
我们用下列命令安装
rabbitmq_management插件,这款插件是可以可视化的方式查看RabbitMQ 服务器实例的状态,以及操控RabbitMQ服务器。
C:\WINDOWS\system32>rabbitmq-plugins enable rabbitmq_management
现在我们在浏览器中输入:http://localhost:15672 可以看到一个登录界面:
这里可以使用默认账号guest/guest登录后的界面如下:
在浏览器中输入 http://localhost:15672/api/ 就可以看到 RabbitMQ Management HTTP API 文档,如下图:
这样就可以查看RabbitMQ server实例状态的相关信息了。
2. 创建和管理用户
用命令rabbitmqctl list_users 查看一下现rabbitmq_management注册用户
发现现在只有一个用户guest,并且它的tag是administrator.
那么在命令行下创建一个用户,创建用户的命令合是:
rabbitmqctl add_user [username] [password]
现在创建一个username=rabbit1 password=rabbit1的用户, 命令如下:
rabbitmqctl add_user rabbit1 rabbit1
创建成功了:
现在看下有多少用户,跑一下命令:
rabbitmqctl list_users
发现用户列表里多了一个用户 rabbit1,但是tag是空的。使用命令给rabbit设置tag,设置tag的命令格式:
rabbitmqctl set_user_tags [user] [tag1] [tag2] ...
因此,设置一个tag为administrator,一个tag为none:
rabbitmqctl set_user_tags rabbit1 administrator none
一次可以给一个用户设置多个tag,也可以设置一个
现在rabbit1 有两个tag了一个是administrator ,一个是none.
有5个tag可供选择,分别是:administrator ,monitoring,policymaker,management和none 有兴趣的同学可以到这里了解各个tag的含义,其实这里的tag代表的是权限,administrator是最高权限,none表示不能访问,这里administrator和none的组合,权限应该是向高看齐,忽略none,用的是administrator的权限。我们用rabbit1/rabbit1 登录rabbitmq_management。
其实有了rabbitmq_management这个可视化插件,很多事情都可以在这个插件里干,包括创建用户,创建交换机(Exchange)和创建队列(Queque)。
关于Rabbit的在windows下的基本配置就告一段落,关于更多的更高级的配置,可以参考官网,有了rabbitmq_management 插件确实方便了不少。下面就开始创建客户端进行测试了。
3. 添加用户、授权、登录
动图显示完整步骤:
第一步:创建用户并设置标签(Tag)
第二步:设置用户权限
现在的权限为可以所有虚拟主机接入权(*)
到这里,RabbitMQ在Windows下的安装与配置基本结束了,下面我们开始Linux下RabbitMQ的使用。
代码测试
为了展示RabbitMQ的基本使用,我们发送一个HelloWorld消息,然后接收并处理!
1. 导入依赖
首先创建一个Maven项目(需要下载依赖,比SpringBoot体积小,测试足够了),导入RabbitMQ的依赖包:
pom.xml
<!-- 最新的amqp客户端 -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.10.0</version>
</dependency>
<!-- 引入rabbitmq-client中所需的slf4j日志依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
**注意:**这里的rabbit-client是依赖于slf4j日志框架持久化消息的,具体细节可以看ConnectFactory类中的源码import的包有slf4j。如果没有导入slf4j,控制台会提示错误(Failed to load class org.slf4j.impl.StaticLoggerBinder),但还是能运行。根据提示的错误,到官网错误页的说明,只要导入 slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar
中的一个即可解决,我们这里导入slf4j-nohup包。
2. 消息发送者
然后创建一个生产者类,用来将消息发送到RabbitMQ的消息队列中,代码如下:
Send.java
package com.deepinsea.rabbitTest.messageTest;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author deepinsea
* @data 2021/1/19 3:54
*/
public class Send {
private final static String QUEUE_NAME = "Somnus";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接
ConnectionFactory factory = new ConnectionFactory();
// // 设置RabbitMQ, 主机ip或者主机名
factory.setHost("127.0.0.1");
// 创建一个连接
Connection connection = factory.newConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 指定一个队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 发送消息
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] 发送消息是:'" + message + "'");
// 关闭连接
channel.close();
connection.close();
}
}
3. 消息接收者
最后创建一个消费者类,用于消费消息队列中的消息;其中消息队列可以设置定时过期,也可以设置持久化消息数据:
Recv.java
package com.deepinsea.rabbitTest.messageTest;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author deepinsea
* @data 2021/1/19 3:56
*/
public class Recv {
private final static String QUEUE_NAME = "Somnus";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接
ConnectionFactory factory = new ConnectionFactory();
// 设置RabbitMQ, 主机ip或者主机名
factory.setHost("127.0.0.1");
// 创建一个连接
Connection connection = factory.newConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 指定一个队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] 等待消息进入. 请按 CTRL+C 结束");
// 创建队列消费者
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [息是:x] 接收消 '" + message + "'");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
4. web管理界面查看
启动项目,并打开web管理界面查看消息(queue):
点击队列名进入
过程分析
首先,需要创建一个ConnectionFactory,设置目标,由于是在本机,所以设置为localhost,如果RabbitMQ不在本机,只需要设置目标机器的IP地址或者机器名称即可,然后设置前面创建的用户名Bruce和密码Bruce123456。
紧接着要创建一个Channel,如果要发送消息,需要创建一个队列,然后将消息发布到这个队列中。在创建队列的时候,只有RabbitMQ上该队列不存在,才会去创建。消息是以二进制数组的形式传输的,所以如果消息是实体对象的话,需要序列化和然后转化为二进制数组。
现在客户端发送代码已经写好了,运行之后,消息会发布到RabbitMQ的消息队列中,现在需要编写服务端的代码连接到·RabbitMQ·上去获取这些消息。
自同样,创建一个名为Receive的服务端控制台应用程序,服务端代码如下:
和发送一样,首先需要定义连接,然后声明消息队列。要接收消息,需要定义一个Consume,然后从消息队列中不断Dequeue消息,然后处理。
可以看到,已经接受到了客户端发送的Hello World,现在再来看RabitMQ上的消息队列信息:
命令行查看:
D:\Program Files\RabbitMQ Server\rabbitmq_server-3.4.2\sbin>rabbitmqctl list_queues
Listing queues ...
hello 0
可以看到,hello这个队列中的消息队列个数为0,这表示,当接收端,接收到消息之后,RabbitMQ上就把这个消息删掉了。
总结
关于RabbitMQ在windows 下的安装和基本设置步骤为:
1.安装对应版本的Erlang 并设置环境变量
2.安装RabbitMQ
3.设置环境变量
4.安装插件rabbitmq_management
欢迎关注白羊🐏,感谢观看ヾ(◍°∇°◍)ノ゙