Springboot 集成 RabbitMQ —— Windows 环境下 RabbitMQ 的单机多实例集群(普通模式+镜像模式)

为了使得 RabbitMQ 可以达到高可用,需要允许消费者和生产者在 RabbitMQ 节点崩溃的情况下可以继续工作,所以一般线上部署的都会是集群。因为在自己的电脑上部署集群,没有那么多的机器,部署真正的多机多实例的情况;所以就有了这篇,单机多 RabbitMQ 实例集群的搭建。

基础概念

RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据存储在内存,这样可以使像交换机、队列声明等操作更加迅速。
Disk node:将元数据存储在磁盘,单节点系统只允许磁盘类型的节点,可以防止重启 RabbitMQ 实例的时候,丢失配置的信息。

注:RabbitMQ 集群中至少要有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须将本次变更通知到至少一个磁盘节点。如果集群中唯一的磁盘节点崩溃,集群仍然可以运行,只是无法进行增删改查操作,只有唯一的磁盘节点节点恢复以后,才可以继续进行增删改查。为了避免这种情况,可以设置两个磁盘节点,保证了至少有一个是磁盘节点,从而可以保存元数据的更改。

集群模式

RabbitMQ 的集群模式一般分为两种,普通模式镜像模式

普通模式:默认的集群模式,以两个节点(rabbit1、rabbit2)为例说明。消息实体只存在其中一个节点 rabbit1 或者 rabbit2,rabbit1 和 rabbit2 两个节点仅有相同的元数据,就是队列的结构。当消息进入 rabbit1 节点的队列(Queue)后,当消费者从 rabbit2 节点消费时,集群会临时在 rabbit1 和 rabbit2 节点间传递消息,把 rabbit1 节点下队列的消息实体取出,然后通过 rabbit2 发送给消费者。所以消费者需要尽量连接每一个节点,同时,需要将同一个逻辑队列,在多个节点都建立。不然消费者连 rabbit1 或 rabbit2 节点,出口却只有 rabbit1,而且当 rabbit1 节点故障后,rabbit2 节点无法取到 rabbit1 节点中还未消费的消息。如果做了消息持久化,还可以等 rabbit1 节点恢复后继续消费;如果没有持久化就会消息丢失消息。

镜像模式:将队列变为镜像队列,存在于多个节点。消息实体会主动在节点之间同步,不会像普通模式,在消费者消费数据时才临时读取。缺点 —— 集群内部的同步会占用大量带宽。

配置普通模式的集群

1、配置系统配置信息,支持单机多实例

普通集群,是从单机形式演变过来的,所以要基于之前的文章《Windows 下搭建 RabbitMQ 环境》,进行相关的配置。

为了使得单台机器可以运行多个 RabbitMQ 实例,我们需要修改一下 hosts 文件,一般情况下 hosts 文件的路径都是 C:\Windows\System32\drivers\etc,增加如图所示的配置信息
在这里插入图片描述
其中节点名 rabbit-node1rabbit-node2 后面会用到

127.0.0.1 rabbit-node1
127.0.0.1 rabbit-node2

为了使用方便,在《Windows 下搭建 RabbitMQ 环境》中配置了 RabbitMQ 的环境变量,为了更清晰的表现出来启动的是哪一个节点的 RabbitMQ 实例,这里最好是删除这个环境变量的设置。

将之前 rabbitmq_server-3.7.7(单机版本的唯一节点实例)的文件复制一份,作为集群下的另外一个节点的 rabbitmq_server-3.7.7-node1 来运行。
在这里插入图片描述

扫描二维码关注公众号,回复: 10819479 查看本文章

2、配置集群内的 rabbit-node1 节点

修改 D:\software\rabbitmq-server-windows-3.7.7\rabbitmq_server-3.7.7\sbin(根据实际安装路径调整)下的 rabbitmq-env.bat 的文件内容,增加如下信息
在这里插入图片描述

set RABBITMQ_CONFIG_FILE=!RABBITMQ_HOME!\etc\rabbitmq-node1
set RABBITMQ_BASE=!RABBITMQ_BASE!\rabbitmq-cluster
set RABBITMQ_NODENAME=rabbit1@rabbit-node1
set RABBITMQ_NODE_PORT=5672

其中 set RABBITMQ_NODENAME=rabbit1@rabbit-node1rabbit-node1 需要与 host 中配置的一致。同时这里面 RABBITMQ_CONFIG_FILE 依赖了 rabbitmq-node1 文件,说明需要一个 rabbitmq-node1 的配置文件,这个文件应该在 D:\software\rabbitmq-server-windows-3.7.7\rabbitmq_server-3.7.7\etc (根据实际的安装路径调整)路径下,如果没有,可以把 rabbitmq.config.example 文件复制一份,并命名 rabbitmq-node1.config 即可。
在这里插入图片描述
为 rabbitmq-node1.config 调整一下监听的配置,新增如下内容
在这里插入图片描述

    {listener, [{port,     15672},
                {ip,       "127.0.0.1"},
                {ssl,      false}
				]}

到此 rabbit-node1 节点的配置基本完成,此时,需要开启 rabbit-node1 节点,进入 rabbit-node1 节点的安装路径(可以使用 cd /d 命令),运行启动命令 rabbitmq-server.bat,如下所示

cd /d D:\software\rabbitmq-server-windows-3.7.7\rabbitmq_server-3.7.7\sbin
rabbitmq-server.bat

出现类似下图的打印信息后,说明 rabbit-node1 启动成功
在这里插入图片描述
再打开一个 DOS 终端,进入 sbin 目录,启用 rabbitmq-plugins 插件

rabbitmq-plugins.bat enable rabbitmq_management

如果一切配置顺利,就可以使用浏览器登录 http://localhost:15672
在这里插入图片描述
看起来好像和单机单实例没什么区别,但是还没完,因为配置的是集群,还要继续配置 rabbit-node2 节点。

2、配置集群内的 rabbit-node2 节点

rabbit-node2 节点的配置和 rabbit-node1 节点的类似。

修改 D:\software\rabbitmq-server-windows-3.7.7\rabbitmq_server-3.7.7-node1\sbin(根据实际安装路径调整)下的 rabbitmq-env.bat 的文件内容,增加如下信息
在这里插入图片描述

set RABBITMQ_CONFIG_FILE=!RABBITMQ_HOME!\etc\rabbitmq-node2
set RABBITMQ_BASE=!RABBITMQ_BASE!\rabbitmq-cluster
set RABBITMQ_NODENAME=rabbit2@rabbit-node2
set RABBITMQ_NODE_PORT=5673

在 rabbit-node2 的配置里面要注意一点 set RABBITMQ_NODENAME=rabbit2@rabbit-node2 节点名称需要与 rabbit-node1 的区分开,这里是 rabbit2 而 rabbit-node1 里面配置的 rabbit1,如果没有区分,rabbit-node2 是无法启动的,会提示如下的错误
在这里插入图片描述
同样在对应的 etc(示例的是 D:\software\rabbitmq-server-windows-3.7.7\rabbitmq_server-3.7.7-node1\etc) 路径下需要一个 rabbitmq-node2.config 的配置文件
在这里插入图片描述
这里监听的端口需要与 rabbit-node1 节点的区分开来,所以使用的 15673

       {listener, [{port,     15673},
                {ip,       "127.0.0.1"},
                {ssl,      false}
				]}

至此,rabbit-node2 节点也配置完成了,我们需要启动一下 rabbit-node2 节点,进入 rabbit-node2 节点的安装路径,运行启动命令 rabbitmq-server.bat,如下所示

cd /d D:\software\rabbitmq-server-windows-3.7.7\rabbitmq_server-3.7.7-node1\sbin
rabbitmq-server.bat

出现如下图所示的打印,说明 rabbit-node2 节点也启动完成
在这里插入图片描述

同样的,再打开一个 DOS 终端,进入 sbin 目录,启用 rabbitmq-plugins 插件

rabbitmq-plugins.bat enable rabbitmq_management

顺利的话,就能使用浏览器登录 http://localhost:15673
在这里插入图片描述

3、配置集群

到现在,只是在单机上运行了两个 RabbitMQ 的实例,还需要继续配置集群。

本文示例是对 rabbit-node2 节点的配置,进入 rabbit-node2 节点的 sbin 目录下操作。
在这里插入图片描述

rabbitmqctl.bat stop_app

rabbitmqctl.bat join_cluster rabbit1@rabbit-node1

rabbitmqctl.bat start_app

普通模式下的集群配置完成了,查看一下,配置是否成功

rabbitmqctl.bat cluster_status

出现类似如下的截图,说明集群配置已经完成。
在这里插入图片描述
从浏览器中查看,出现如下的截图,说明配置完成。
在这里插入图片描述
在这里插入图片描述
注:这个时候的集群还不具有高可用,当我们在 springboot 项目里配置了这个集群的时候,手动关闭 rabbit-node1 节点,我们的项目就不能继续收发消息了。原因已经在集群模式一段中介绍了。

配置镜像模式的集群

镜像模式是基于普通模式的配置,所以没有把镜像模式单独列出来一章来讲述,接下来看看怎么配置吧。

Admin 分页下,点击 Policies 选项,添加新的策略
在这里插入图片描述
新策略可以按照截图中配置。
在这里插入图片描述
Name:策略的名称,自行定义。
Pattern:匹配规则,这里是为所有队列镜像,使用的是 .* 。
Apply to:适用于什么对象,可以选择,示例选择的是交换器和队列。
Definition:需要配置 ha-modeha-sync-mode

    ha-mode 提供了三种模式:
	    all:全部的节点队列都做镜像 --- 示例的配置项
	    exactly:指定镜像队列的节点上限数量
	    nodes:只为指定节点配置镜像队列
    ha-sync-mode 提供了两种模式:
        automatic:自动 --- 示例的配置项
        manual:手动

配置完成后,点击 Add policy
在这里插入图片描述
如果新策略添加成功,如有如截图中的内容。
在这里插入图片描述
在这里插入图片描述
到现在,RabbitMQ 集群的镜像模式配置完成了。

测试镜像模式的集群

要测试 RabbitMQ 集群的高可用,需要使用之前的 Springboot 项目,使 Springboot 项目依赖这个 RabbitMQ 集群。
在这里插入图片描述
因为依赖的是集群,所以不再是是使用单个 RabbitMQ 实例的地址和端口。

spring.rabbitmq.addresses=127.0.0.1:5672, 127.0.0.1:5673

先看看,我们的集群,使用的是哪个节点的哪个队列
在这里插入图片描述
再来看看测试代码的实现
在这里插入图片描述
在这里插入图片描述
当集群的两个节点都在运行的时候,做一次发送
在这里插入图片描述
这个时候可以收到消息
在这里插入图片描述
现在关闭一个节点测试一下,把 rabbit-node1 节点关掉
在这里插入图片描述
先看看现在集群使用的队列 在这里插入图片描述
再发一次消息
在这里插入图片描述
还是可以正常的收发消息。

发布了34 篇原创文章 · 获赞 34 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_19154605/article/details/104379186