第一部分:RabbitMQ介绍
RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层。保存这个数据。
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
1.1 几个重要概念
一般的消息中间件的工作流程可以用消费者模式来表示。即消费者不断向消息队列发送消息,生产者不断从消息队列中取出消息进行消费,如下图所示:
对于rabbitMQ来说,除了最基本的消费者,消息队列,生产者之外,还引进了一个新的模块,即交换机(Exchange)。它使得生产者和消息队列之间进行了隔绝,生产者只需要将消息发给交换机,有交换机根据一定的调度策略,将消息发送给相应的消息队列。RabbitMQ的 工作流程如下:
至此,RabbitMQ的几个重要概念就出来了:
1.生产者:生产消息的应用程序
2.消费者:消费消息的应用程序
3.消息:一串二进制数据流
4.队列:消息的暂存/存储区
5.交换机:消息的中转站,用于接收分发消息, 有 fanout,direct,topic,headers四种类型
6.路由(绑定关系):将消息队列和交换机进行绑定(BindingKey),交换机才能将消息发送到指定队列。
下面重点介绍一下交换机:
1.Direct类型的交换机
Direct是RabbitMQ默认的交换机模式,也是最简单的模式.即创建消息队列的时候,指定一个BindingKey.当发送者发送消息的时候,指定对应的Key.当Key和消息队列的BindingKey一致的时候,消息将会被发送到该消息队列中.
2.Topic类型的交换机
topic转发信息主要是依据通配符,队列和交换机的绑定主要是依据一种模式(通配符+字符串),而当发送消息的时候,只有指定的Key和该模式相匹配的时候,消息才会被发送到该消息队列中.
3.Fanout类型的交换机
Fanout是路由广播的形式,将会把消息发给绑定它的全部队列,即便设置了key,也会被忽略.
4.Headers类型的交换机
headers 也是根据规则匹配, 相较于 direct 和 topic 固定地使用 routing_key , headers 则是一个自定义匹配规则的类型. 在队列与交换器绑定时, 会设定一组键值对规则, 消息中也包括一组键值对( headers 属性), 当这些键值对有一对, 或全部匹配时, 消息被投送到对应队列.
至此,概念部分基本就完了。注意本地安装RabbitMQ的话,需要先安装Erlang,注意Erlang和rabbitMQ的版本不要差太多,否则rabbitMQ启动会报错(我安装的是RabbitMQ 3.6.5, Erlang 18.1)。
第二部分:spring boot 集成RabbitMQ
2.1 添加pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.2 application.properties中添加配置信息
spring.application.name=spirng-boot-rabbitmq-sender
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#并发消费者的初始化值
spring.rabbitmq.listener.concurrency=1
#并发消费者的最大值
spring.rabbitmq.listener.max-concurrency=1
#每个消费者每次监听时可拉取处理的消息数量
spring.rabbitmq.listener.prefetch=1
下面的配置,如果不是业务必须,都可以不配置,spring-amqp中都有默认配置
2.3 配置ConnectionFactory
这里的ConnectionFactory指的是spring-rabbit包下面的ConnectionFactory接口
@Configuration
public class MqProducerConfig {
@Autowired
@Bean
public ConnectionFactory amqpConnectionFactory(ConnectionListener connectionListener,
RecoveryListener recoveryListener,
ChannelListener channelListener) {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses("localhost:5672");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");
connectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CHANNEL);
connectionFacto