一、为什么需要rabbit mq
1、同步变异步
同步:
异步传统的做法是加个线程池:
异步消息队列MQ:
解决了:
(1)不用自己实现线程池
(2)解耦
2、高内聚低耦合
如果在订单服务中,要加微信通知功能。同步方式就要改订单服务代码。用消息队列方式,不用改订单服务一行代码,新增一个微信服务,然后订阅MQ系统消息就可以了
解耦的目的就是,每个服务只关心自己的逻辑业务3、流量削峰
用户请求过来,先写消息队列,消息队列设置最大值。如果超过最大值则抛弃消息,或者跳转到错误页面。秒杀服务根据消息队列做后续的下单处理
4、什么是队列
队列就像存放商品的仓库或者商店,是生产商品的工厂和购买商品的用户之间的中转站。
(1)队列存储了什么
在RabbitMQ中,信息流从你的应用程序出发,来到RabbitMQ的队列,所有信息可以只存储在一个队列中。
队列可以存储很多的消息,因为它基本上是一个无限制的缓冲区,前提是你的机器有足够的存储空间。
(2)队列和应用程序的关系
多个生产者可以将消息发送到同一个队列中,多个消费者也可以只从同一个队列接收数据。
二、springboot整合rabbitmq
1、pom文件添加
<!--rabbitmq-->
<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>
2、配置文件添加
spring:
rabbitmq:
host: 192.168.3.203
port: 5672
username: admin
password: admin
virtual-host: my_vhost
注:不设置虚拟host,应用启动会报错
3、添加发送队列RabbitSenderConfig.java
经测试不用配置这个类,发送端和接收端只要填对queue名称就能发送和接收!
package com.example.config;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitSenderConfig {
@Bean
public Queue queue() {
//有四个参数
//name: 队列名称
//durable: 是否持久化,默认true
//exclusive: 该队列只能被创建者使用,默认false
//autoDelete: 长时间不用队列会被自动删除,默认false
return new Queue("testQueue");
}
}
4、添加消息发送类RabbitController.java
package com.example.web;
import java.util.Date;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@Api(description = "rabbitmq测试接口")
@RestController
@RequestMapping("/rabbit")
public class RabbitController {
@Autowired
RabbitTemplate rabbitTemplate;
@ApiOperation("发送一条记录")
@GetMapping("/send")
public void send() {
String msg = "hello" + new Date();
//第一个参数是queue名称,第二个参数是msg
rabbitTemplate.convertAndSend("testQueue", msg);
}
}
5、添加消息接收类RabbitService.java
package com.example.rabbit;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class RabbitService {
@RabbitListener(queues = "testQueue") //监听队列名称
public void process(String msg) {
System.out.println("receiver:" + msg);
}
}
6、测试并登陆后台查看Queue