rabbitMQ的主要作用是解耦,异步和流量消峰。举个例子,我有个etc加油自动扣费的项目。用户在加完油以后我扣费就行了,但是我想做一个信息采集,而信息收集,而信息收集用户是不需要关心,并且用户也不需要知道采集是否成功。如果把代码耦合在一起,采集失败不让用户消费,这样不合理,因为数据采集,让用户扣费多等待1秒钟这样也不合理。所以把采集和扣费通过rabbitMQ进行解耦和异步。削峰的概念就是处理同一时间有大量请求的问题,如果同一时间有很多很多车辆同时消费,而我后台扣费和信息采集时后台的能力有限,就要通过rabbitMQ做一个缓冲。
本文主要介绍一下rabbitMQ的一些基础使用方式,下一篇会对rabbitMQ在实际项目中的使用进行详细讲述。
具体的安装过程就不在记录了。最后能访问rabbitMQ控制台说明已经安装成功。本篇主要对rabbitMQ在项目中的基本使用方法做记录。
首先先介绍一下交换机的集中基本使用模式。rabbitMQ有几个基本概念,虚拟主机,队列,交换机和绑定。从网上找了一张我感觉画的最好看的图。
整个rabbitMQ服务可以看做一个虚拟主机。消息的生产者发出消息后,经过虚拟主机的处理,最后由消息的消费者接收。rabbitMQ的集中模式都是消息处理的方式。下面挨个开始介绍一下集中模式与项目的集成和实现。
一,项目集成。
1,此次集成我们用到service和web两个服务。web项目作为消息的生产者,service项目作为消息的消费者。首先在两个服务的pom文件中引入依赖的包。
2,在两个服务的配置文件中加入rabbitMQ的配置。
二,直连交换机。一个队列绑定一个交换机,交换机器绑定一个键值,我们称为路由键。消息生产者发出的每个消息都带着一个键值,当消息的键值和交换机的键值完全匹配的时候,消息就会被转发。
1,在两个项目的config包中创建直连交换机的配置文件DirectRabbitConfig。一个配置文件在两个项目中分别复制一份。
2,web项目中创建一个测试controller,名字为AmqpController。并且创建一个测试方法。
3,在service项目中创建rabbitmq包,并且创建一个直连交换机的消息接收类。
4,此时启动我们的项目。通过postman发送测试。
5,直连交换机收到了消息。
三,主题交换机。路由键与一个类似于正则的模式匹配。规则是符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。消息的生产者绑定的键值与模式路由键匹配,消息就可以分发。
1,在两个项目的config包中创建主题交换机的配置文件。
2,在web项目的controller中写两个测试方法。
3,在service的rabbitmq包中创建两个消息接收类。一个消息接收类的路由键是只接收topic.man的消息,一个是接收所有topic开头的消息。
4,通过postman测试sendtopicmessage1,发现发送键值为topic.man的消息时,两个交换机都可以收到消息。
5,通过postman测试sendtopicmessage2,发现发送键值为topic.woman的消息时,发现只有路由键是topic.#的才能接收到消息。并且是绑定在该交换机所有的队列都可以接收到消息。
四,扇形交换机。扇形交换机不绑定路由键,只要发送到扇形交换机的消息,都会被转发到绑定到该交换机的队列上,就像广播一样。
1,在两个项目中创建扇形交换机的配置文件。
2,在web的controller中创建测试消息生产者。
3,在service的rabbitmq包中创建三个消息接收类。
4,通过postman发送消息。
5,三个队列都可以接收到消息。
五,消息确认。
1,在项目中要增加消息确认的配置,我们在最开始的时候已经加上了。
2,在web项目中的config包中配置消息确认回调函数。
3,创建个消息生产者。这种情况是测试没有找到交换机的情况。
4,使用postman发送测试。
5,查看返回结果。发现消息发送了,但是没找到交换机,会触发ConfirmCallback 回调。
6,在两个项目的的DirectRabbitConfig中增加一个交换机。但是不绑定任何队列。这种情况是测试找到交换机但是没找到队列的情况。
7,创建一个消息生产者测试方法。
8,使用postman进行测试。
9,查看返回结果,发现两个回调函数都被调用了。
10,测试发送成功的情况。
11,查看回调结果。
六,手动消息确认。
1,service项目的config包中创建MessageListenerConfig
2,修改直连交换的接收代码,增加消息处理。
3,使用postman发送直连交换机消息测试。
4,查询结果,发现消息已经接收到并且已经确认。
5,如果有些消息需要手动确认,有些消息需要自动确认,只需要修改MessageListenerConfig的simpleMessageListenerContainer,把需要手动确认的加进去就可以了。
6,注意加进去的消息处理类要继承ChannelAwareMessageListener。
并实现里面的消息处理方法onMessage即可。
通过向微信公众号发送springcloud可以获取git源码地址。