springboot+RabbitMQ(消息队列)
1、什么是RabbitMQ?
1.1、什么是MQ?
消息队列(Message Queue,简称MQ),既是Queue,那么应该是FIFO(先进先出)的原则,并且队列里面存放的是Message。
1.2、为什么要用MQ?
1、不同的进程之间在传递消息时,由于耦合度太高,改动很大,故将两个进程进行解耦,也就是再抽出一个模块即消息队列,来传递两个进程之间的消息,这样单独修改一个进程另一个进程就不会受到影响了。
2、不同的进程之间传递消息,为了实现标准化。
3、处理消息的进程一下子无法处理完很多的传递过来的消息,所以必须要给收到的消息排队。
1.3、RabbitMQ介绍
RabbitMQ是一个开源的、在AMQP基础上完成的、可复用的企业级的消息系统。支持主流的操作系统(Linux、Windows等),并且支持多种开发语言(java、c/c++等)。
2、springboot整合RabbitMQ
2.1、搭建RabbitMQ的环境
2.1.1、下载地址:RabbitMQ下载
2.1.2、安装
安装网上都有教程的,不展开详细的说明了。
2.1.3、启动
安装完成后,启动RabbitMQ,在浏览器中输入地址:http://127.0.0.1:15672/ 其中127.0.0.1是要根据你的安装的机器的ip变化而更改的。如图:
然后使用默认账号登录:账号密码都是guest
2.2、新建一个springboot项目
大概的结构像下图就可以:
2.3、pom文件和RabbitMQ配置文件
pom文件依赖部分(其实就加一个amqp的依赖就好了):
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.properties配置文件:
server.port=8080
spring.application.name=springboot-rabbitmq-demo
spring.rabbitmq.host=10.10.38.54
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.virtual-host=/
在启动类中声明一个Queue使用:
@SpringBootApplication
public class RabbitmqDemoApplication {
@Bean
public Queue helloQueue() {
return new Queue("helloQueue");
}
3、分场景实现整合(整个过程迭代)
3.1、多种情况统一归类(三种如下情况)
1、单生产者和单消费者。2、单生产者和多消费者。3、多生产者和多消费者。
controller层中接口如下:
生产者代码如下:
消费者代码如下:
然后根据上面的项目框架图的结构,自己增加多个生产者和消费者。
执行结果(多生产者对多消费者):
然后在RabbitMQ管理界面就可以看到下图的情况:
3.2、实体类传输(实体类必须序列化)
实体类的传输支持了对象的发送和接收,但是需要将实体类进行序列化。
随便创建一个实体类:
在controller层中加一个接口:
然后在生产者1号或者2号都加上发送代码:
接着就是消费者1号或者2号加上处理代码:
运行结果如下图:
此时RabbitMQ Management如下图所示:
3.3、TopicExchange(主题模式)
TopicExchange 是RabbitMQ中最灵活的一种方式,它可以根据routing_key自由绑定不同的队列。
在controller中新起一个接口:
然后在启动类中新加两个Queue,并且将这两个队列与exchange绑定:
生产者如下:
消费者另外再写(TopMessageReceiver等)如下:
运行结果如下:
3.4、FanoutExchange(订阅模式)
此模式就是广播模式,给Fanout交换机发送消息,绑定了这个交换机的所有队列都会收到这个消息。
首先在controller层中再重新声明一个接口:
然后在启动类中再声明三个Queue和Exchange 并且绑定:
生产者中发送消息:
消费者中接受处理消息:
运行结果:
4、总结
通过学习了RabbitMQ,知道了RabbitMQ是个什么,可以用来做什么,可以使用MQ实现商品数据同步,可以使用MQ来降低系统之间的耦合,当然也可以便于管理数据的同步。说明:本次学习主要参考:https://www.liangzl.com/get-article-detail-21642.html 和 https://blog.csdn.net/hellozpc/article/details/81436980#1MQ_9 这两篇博客进行的,需要的话可以直接去他们那里学习。