MQ的应用场景
- 异步处理。比如注册,注册后会发送短信以及创建角色,这时候发送短信和创建角色可以异步进行,而不必等发送完短信之后再创建角色
- 流量削峰。若出现流量暴增的情况如秒杀,可能会导致应用响应过慢甚至瘫痪,这时候就加入消息队列。超过最大数量就抛弃请求,跳转到相应错误页面等。
- 日志处理。典型的是kafaka,采集日志定时存入消息队列,队列进行接收,储存和转发
- 应用解耦。比如下单服务需要查询商品服务,若平常操作,这两个服务是耦合即密切依赖的,而通过消息队列,下单将消息发送到消息队列,后不再关注。商品服务订阅该消息队列,拿到消息后处理相关请求。
流程
RabbitMQ中有Exchange和Queue。首先Exchange可以不适用,直接使用Queue。若要将消息分组,比如商城的衣服和鞋包分为两组,就要用到Exchange。将Queue绑定到Exchange,Exchange通过key路由到Queue。服务将消息发送到相应Exchange的Queue,接收消息的服务订阅相应Queue,拿到消息。
SpringBoot集成
pom引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
配置文件加入mq配置(git中)
spring:
rabbitmq:
host:
port: 5672
username: guest
password: guest
新建一个监听文件,当接收端
@Slf4j
@Component
public class MqRecevicer {
// 1. @RabbitListener(queues = "myQueue") //选择已有queue,此时mq中应存在此queue
// 2. @RabbitListener(queuesToDeclare = @Queue("myQueue")) //自动创建queue
// 以上两个用法并未使用分组
@RabbitListener(bindings = @QueueBinding(
exchange = @Exchange("testExchange"),
key = "dress", //根据key路由到queue
value = @Queue("dressQueue")
)) //自动创建mq,exchange和queue绑定
public void processDress(String message){
log.info("receive message from dress: {}", message);
}
//
@RabbitListener(bindings = @QueueBinding(
exchange = @Exchange("testExchange"),
key = "shoes",
value = @Queue("shoesQueue")
))
public void processShoes(String message){
log.info("receive message from shoes: {}", message);
}
}
新建测试文件,当发送端
@Component
public class MqSenderTest extends OrderApplicationTest {
@Autowired
private AmqpTemplate amqpTemplate;
@Test
public void send(){
amqpTemplate.convertAndSend("testExchange", "shoes","test the shoes");
}
}
运行就会在控制台打印
receive message from shoes: test the shoes