【消息队列】Windows下安装与配置RabbitMQ

1,374 阅读11分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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

image.png

配置环境变量

安装完成后配置环境变量:

image.png

验证

配置完环境变量后,win + R 运行cmd,打开命令行,输入erl,回车

image.png

出现类似Eshell V10.0.1 (abort with ^G)的字样,说明配置成功。

使用测试

1、输入1 + 1 . 注意要加上 . (英文句号-半角),再输入回车,出现结果2

2、输入“Hello World”,再输入回车,出现结果“Hello World”

crtl+c退出Eshell

image.png

安装RabbitMQ

在搭建RabbitMQ环境过程中,如果RabbiteMQErlang版本不一致会导致环境搭建出问题(爬过坑了😩)。

版本兼容问题

以下是RabbitMQErlang的版本对应关系:

RabbitMQ版本最低要求的Erlang / OTP**最大支持的Erlang / OTP笔记
3.8.9(最新)22.323.xErlang / OTP 23兼容性说明 推荐使用Erlang 23.x Erlang 22.x不再支持HiPE
3.8.8 3.8.7 3.8.6 3.8.5 3.8.421.323.xErlang / OTP 23兼容性说明 建议使用Erlang 22.x或23.x Erlang 22.x不再支持HiPE
3.8.3 3.8.2 3.8.1 3.8.021.322.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.1921.322.x不再支持Erlang / OTP 20.x Erlang 22.x不再支持HiPE
3.7.18 3.7.17 3.7.16 3.7.1520.322.xErlang / OTP 22.0兼容性说明 默认情况下,在Erlang 22.x上禁用TLSv1.0和TLSv1.1支持
3.7.14 3.7.13 3.7.12 3.7.1120.321.x不再支持Erlang / OTP 19.x 为了获得最佳的TLS支持,建议使用最新版本的Erlang / OTP 21.x
3.7.10 3.7.9 3.7.8 3.7.719.321.xErlang / OTP 21.0兼容性说明
3.7.6 3.7.5 3.7.4 3.7.3 3.7.2 3.7.1 3.7.019.320.x为了获得最佳的TLS支持,建议使用最新版本的Erlang / OTP 20.x 19.3.6.4之前的Erlang版本具有已知的错误(例如ERL-430ERL-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, 然后点击默认安装。

image.png

**注意:必须使用==管理帐户==**来安装Erlang,否则RabbitMQ Windows服务将无法发现它。

一旦安装了受支持的Erlang版本,请下载RabbitMQ安装程序rabbitmq-server- {version} .exe 并运行它。它将RabbitMQ安装为Windows服务,并使用默认配置启动它。

RabbitMQ安装步骤与Erlang差不多,当RabbitMQ安装时会请求授权与Erlang进行网络通信(因为RabbitMQ是基于Erlang开发 的)。

安装完成后,RabbitMQ是作为windows service 运行在后台!

设置环境变量

首先在系统变量(用户变量中不能引入到系统变量里)里添加一个RABBITQM_SERVER变量:

image.png

然后在系统的path变量中配置如下:

image.png

这样就可以在windows administrator启动的CMD窗口操控RabbitMQ服务了,不需要每次都定位到执行目录。

验证

运行服务:

1、执行rabbitmq命令行工具(rabbitmqctl ):

rabbitmqctl -q status    //打印了一些rabbitmq服务状态信息,包括内存,硬盘,和使用erlong的版本信息

rabbitmq-server start	//开启rabbitmq服务

rabbitmq-server stop	//关闭rabbitmq服务

image.png

image.png

image.png

rabbitmqctl list_queues     //查看所有队列消息

image.png

**注意:**只要开启了RabbitMQ服务,那么对应的http://localhost:15672端口就会自动打开,可以直接在浏览器中输入以上地址访问验证RabbitMQ是否安装成功!

扩展

——参考自《Windows上的RabbitMQ官网安装指南》

如果没有配置环境变量,可以cdRabbitMQ安装目录下的/sbin目录;然后采用(默认的)宾客身份以CLI命令运行验证基本的运行情况,并显示有关该节点(如果正在运行)的一些信息。

#对节点和CLI工具的连接/身份验证

abbitmqctl.bat status

为了使其正常工作,必须满足两个条件:

  • 该节点必须正在运行
  • rabbitmqctl.bat必须能够通过该节点进行身份验证

默认用户访问

该协议(Broker)将创建一个用户来宾与密码 客人。未配置的客户端通常将使用这些凭据。**默认情况下,仅当以本地主机身份连接到代理时,才可以使用这些凭据,**因此您需要在从任何其他计算机连接之前采取措施。

请参阅访问控制文档,以获取有关如何创建更多用户和删除来宾用户的信息。

可视化界面配置

1. 安装rabbitmq管理工具(图形化工具)

我们用命令查看一下RabbtitMQ的所有插件:

C:\WINDOWS\system32>rabbitmq-plugins list // 查看所有插件

看到RabbtitMQ罗列出来了很多插件:

image.png 我们用下列命令安装rabbitmq_management插件,这款插件是可以可视化的方式查看RabbitMQ 服务器实例的状态,以及操控RabbitMQ服务器。

C:\WINDOWS\system32>rabbitmq-plugins enable rabbitmq_management

image.png

现在我们在浏览器中输入:http://localhost:15672 可以看到一个登录界面:

image.png

这里可以使用默认账号guest/guest登录后的界面如下:

image.png

在浏览器中输入 http://localhost:15672/api/ 就可以看到 RabbitMQ Management HTTP API 文档,如下图:

image.png

这样就可以查看RabbitMQ server实例状态的相关信息了。

2. 创建和管理用户

用命令rabbitmqctl list_users 查看一下现rabbitmq_management注册用户

image.png

发现现在只有一个用户guest,并且它的tag是administrator.

那么在命令行下创建一个用户,创建用户的命令合是:

rabbitmqctl add_user [username] [password]

现在创建一个username=rabbit1 password=rabbit1的用户, 命令如下:

rabbitmqctl add_user rabbit1 rabbit1

创建成功了:

image.png

现在看下有多少用户,跑一下命令:

rabbitmqctl list_users

image.png

发现用户列表里多了一个用户 rabbit1,但是tag是空的。使用命令给rabbit设置tag,设置tag的命令格式:

rabbitmqctl set_user_tags [user] [tag1] [tag2] ...

因此,设置一个tag为administrator,一个tag为none:

rabbitmqctl set_user_tags rabbit1 administrator none

一次可以给一个用户设置多个tag,也可以设置一个

image.png

现在rabbit1 有两个tag了一个是administrator ,一个是none.

有5个tag可供选择,分别是:administrator ,monitoring,policymaker,management和none 有兴趣的同学可以到这里了解各个tag的含义,其实这里的tag代表的是权限,administrator是最高权限,none表示不能访问,这里administrator和none的组合,权限应该是向高看齐,忽略none,用的是administrator的权限。我们用rabbit1/rabbit1 登录rabbitmq_management。

image.png

其实有了rabbitmq_management这个可视化插件,很多事情都可以在这个插件里干,包括创建用户,创建交换机(Exchange)和创建队列(Queque)。

关于Rabbit的在windows下的基本配置就告一段落,关于更多的更高级的配置,可以参考官网,有了rabbitmq_management 插件确实方便了不少。下面就开始创建客户端进行测试了。

3. 添加用户、授权、登录

动图显示完整步骤:

img

第一步:创建用户并设置标签(Tag)

image.png

第二步:设置用户权限

image.png

image.png 现在的权限为可以所有虚拟主机接入权(*)

image.png

image.png

到这里,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):

image.png

点击队列名进入

image.png

过程分析

首先,需要创建一个ConnectionFactory,设置目标,由于是在本机,所以设置为localhost,如果RabbitMQ不在本机,只需要设置目标机器的IP地址或者机器名称即可,然后设置前面创建的用户名Bruce和密码Bruce123456。

紧接着要创建一个Channel,如果要发送消息,需要创建一个队列,然后将消息发布到这个队列中。在创建队列的时候,只有RabbitMQ上该队列不存在,才会去创建。消息是以二进制数组的形式传输的,所以如果消息是实体对象的话,需要序列化和然后转化为二进制数组。

现在客户端发送代码已经写好了,运行之后,消息会发布RabbitMQ的消息队列中,现在需要编写服务端的代码连接到·RabbitMQ·上去获取这些消息。

自同样,创建一个名为Receive的服务端控制台应用程序,服务端代码如下:

和发送一样,首先需要定义连接,然后声明消息队列。要接收消息,需要定义一个Consume,然后从消息队列中不断Dequeue消息,然后处理。

可以看到,已经接受到了客户端发送的Hello World,现在再来看RabitMQ上的消息队列信息:

image.png

命令行查看:

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

欢迎关注白羊🐏,感谢观看ヾ(◍°∇°◍)ノ゙