以前看过的关于RabbitMQ核心消息模式的文章都是基于Java API的,最近看了下官方文档,发现这些核心消息模式都可以通过Spring AMQP来实现。于是总结了下RabbitMQ的实用技巧,包括RabbitMQ在Windows和Linux下的安装、5种核心消息模式的Spring AMQP实现,相信对于想要学习和回顾RabbitMQ的朋友都会有所帮助。
简介
RabbitMQ是最受欢迎的开源消息中间件之一,在全球范围内被广泛应用。RabbitMQ是轻量级且易于部署的,能支持多种消息协议。RabbitMQ可以部署在分布式系统中,以满足大规模、高可用的要求。
相关概念
我们先来了解下RabbitMQ中的相关概念,这里以5种消息模式中的路由模式
为例。
安装及配置
接下来我们介绍下RabbitMQ的安装和配置,提供Windows和Linux两种安装方式。
Windows下的安装
- 安装Erlang,下载地址:http://erlang.org/download/otp_win64_21.3.exe
- 安装RabbitMQ,下载地址:https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.14.exe
- 安装完成后,进入RabbitMQ安装目录下的sbin目录;
- 在地址栏输入cmd并回车启动命令行,然后输入以下命令启动管理功能。
Linux下的安装
- 下载
rabbitmq 3.7.15
的Docker镜像;
- 使用Docker命令启动服务;
- 进入容器并开启管理功能;
- 开启防火墙便于外网访问。
访问及配置
- 访问RabbitMQ管理页面地址,查看是否安装成功(Linux下使用服务器IP访问即可):http://localhost:15672/
- 输入账号密码并登录,这里使用默认账号密码登录:guest guest
- 创建帐号并设置其角色为管理员:mall mall
- 创建一个新的虚拟host为:/mall
- 点击mall用户进入用户配置页面;
- 给mall用户配置该虚拟host的权限;
- 至此,RabbitMQ的配置完成。
5种消息模式
这5种消息模式是构建基于RabbitMQ的消息应用的基础,一定要牢牢掌握它们。学过RabbitMQ的朋友应该了解过这些消息模式的Java实现,这里我们使用Spring AMQP的形式来实现它们。
简单模式
简单模式是最简单的消息模式,它包含一个生产者、一个消费者和一个队列。生产者向队列里发送消息,消费者从队列中获取消息并消费。
模式示意图
Spring AMQP实现
- 首先需要在
pom.xml
中添加Spring AMQP的相关依赖;
- 然后修改
application.yml
,添加RabbitMQ的相关配置;
- 添加
简单模式
相关Java配置,创建一个名为simple.hello
的队列、一个生产者和一个消费者;
- 生产者通过
send方法
向队列simple.hello
中发送消息;
- 消费者从队列
simple.hello
中获取消息;
- 在controller中添加测试接口,调用该接口开始发送消息;
- 运行后结果如下,可以发现生产者往队列中发送消息,消费者从队列中获取消息并消费。
工作模式
工作模式是指向多个互相竞争的消费者发送消息的模式,它包含一个生产者、两个消费者和一个队列。两个消费者同时绑定到一个队列上去,当消费者获取消息处理耗时任务时,空闲的消费者从队列中获取并消费消息。
模式示意图
Spring AMQP实现
- 添加
工作模式
相关Java配置,创建一个名为work.hello
的队列、一个生产者和两个消费者;
- 生产者通过
send方法
向队列work.hello
中发送消息,消息中包含一定数量的.
号;
- 两个消费者从队列
work.hello
中获取消息,名称分别为instance 1
和instance 2
,消息中包含.
号越多,耗时越长;
- 在controller中添加测试接口,调用该接口开始发送消息;
- 运行后结果如下,可以发现生产者往队列中发送包含不同数量
.
号的消息,instance 1
和instance 2
消费者互相竞争,分别消费了一部分消息。
发布/订阅模式
发布/订阅模式是指同时向多个消费者发送消息的模式(类似广播的形式),它包含一个生产者、两个消费者、两个队列和一个交换机。两个消费者同时绑定到不同的队列上去,两个队列绑定到交换机上去,生产者通过发送消息到交换机,所有消费者接收并消费消息。
模式示意图
Spring AMQP实现
- 添加
发布/订阅模式
相关Java配置,创建一个名为exchange.fanout
的交换机、一个生产者、两个消费者和两个匿名队列,将两个匿名队列都绑定到交换机;
- 生产者通过
send方法
向交换机exchange.fanout
中发送消息,消息中包含一定数量的.
号;
- 消费者从绑定的匿名队列中获取消息,消息中包含
.
号越多,耗时越长,由于该消费者可以从两个队列中获取并消费消息,可以看做两个消费者,名称分别为instance 1
和instance 2
;
- 在controller中添加测试接口,调用该接口开始发送消息;
- 运行后结果如下,可以发现生产者往队列中发送包含不同数量
.
号的消息,instance 1
和instance 2
同时获取并消费了消息。
路由模式
路由模式是可以根据
路由键
选择性给多个消费者发送消息的模式,它包含一个生产者、两个消费者、两个队列和一个交换机。两个消费者同时绑定到不同的队列上去,两个队列通过路由键
绑定到交换机上去,生产者发送消息到交换机,交换机通过路由键
转发到不同队列,队列绑定的消费者接收并消费消息。
模式示意图
Spring AMQP实现
- 添加
路由模式
相关Java配置,创建一个名为exchange.direct
的交换机、一个生产者、两个消费者和两个匿名队列,队列通过路由键
都绑定到交换机,队列1
的路由键为orange
和black
,队列2
的路由键为green
和black
;
- 生产者通过
send方法
向交换机exchange.direct
中发送消息,发送时使用不同的路由键
,根据路由键
会被转发到不同的队列;
- 消费者从自己绑定的匿名队列中获取消息,由于该消费者可以从两个队列中获取并消费消息,可以看做两个消费者,名称分别为
instance 1
和instance 2
;
- 在controller中添加测试接口,调用该接口开始发送消息;
- 运行后结果如下,可以发现生产者往队列中发送包含不同
路由键
的消息,instance 1
获取到了orange
和black
消息,instance 2
获取到了green
和black
消息。
通配符模式
通配符模式是可以根据
路由键匹配规则
选择性给多个消费者发送消息的模式,它包含一个生产者、两个消费者、两个队列和一个交换机。两个消费者同时绑定到不同的队列上去,两个队列通过路由键匹配规则
绑定到交换机上去,生产者发送消息到交换机,交换机通过路由键匹配规则
转发到不同队列,队列绑定的消费者接收并消费消息。
特殊匹配符号
*
:只能匹配一个单词;#
:可以匹配零个或多个单词。
模式示意图
Spring AMQP实现
- 添加
通配符模式
相关Java配置,创建一个名为exchange.topic
的交换机、一个生产者、两个消费者和两个匿名队列,匹配*.orange.*
和*.*.rabbit
发送到队列1
,匹配lazy.#
发送到队列2
;
- 生产者通过
send方法
向交换机exchange.topic
中发送消息,消息中包含不同的路由键
;
- 消费者从自己绑定的匿名队列中获取消息,由于该消费者可以从两个队列中获取并消费消息,可以看做两个消费者,名称分别为
instance 1
和instance 2
;
- 在controller中添加测试接口,调用该接口开始发送消息;
- 运行后结果如下,可以发现生产者往队列中发送包含不同
路由键
的消息,instance 1
和instance 2
分别获取到了匹配的消息。
参考资料
RabbitMQ Tutorials:https://www.rabbitmq.com/getstarted.html
项目源码地址
https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-rabbit
花了3天总结的RabbitMQ实用技巧,有点东西!