异步的常见形态:

  • 通知:单向请求,你对他放电,他为你绝缘
  • 请求/异步相应:客户端发送请求到服务端,服务端异步响应请求,客户端不会阻塞,而且被设计成默认相应,不会立刻送达
  • 消息:利用消息可以实现一对多的交互,比如发布-订阅模式

MQ的应用场景:

  • 异步处理:比如用户注册之后,需要发短信和加积分,注册信息写入数据库后通过异步消息让短信服务和积分服务去做他们的事,提升用户体验
  • 流量削峰:常见于秒杀场景,访问过大导致流量剧增甚至挂掉。一般在应用前端加入消息队列控制用户数量,如果超出,则抛弃用户请求,或者让他跳转到错误页面,再做控制处理
  • 日志处理:最典型的就是kafka,这个消息队列设计的时候就是用户日志处理
  • 应用解耦:用户下单后,订单服务通知商品服务,订单持久化处理,消息写入队列,让商品服务来订阅这个消息,再做对应操作。

使用RabbitMQ

1.引入依赖

spring gateway filter redis异步写法 spring cloud 异步_rabbitmq

配置文件(可以直接放在配置中心中)

spring gateway filter redis异步写法 spring cloud 异步_队列_02

建一个类,接收MQ消息

此处用到一个注解:@RabbitListener

spring gateway filter redis异步写法 spring cloud 异步_分布式_03

再写一个发送消息

发送主要用到AmqpTemplate.convertAndSent()

spring gateway filter redis异步写法 spring cloud 异步_分布式_04

在mq控制台新建这个队列

spring gateway filter redis异步写法 spring cloud 异步_发送消息_05

改进(能不能自动帮我建队列,不用我自己去控制台建)

在接收mq消息的地方,这样写

spring gateway filter redis异步写法 spring cloud 异步_日志处理_06

改进2(自动创建队列并自动绑定Exchange)

spring gateway filter redis异步写法 spring cloud 异步_队列_07

消息的分组

订单服务发送消息,发送给数码服务和水果服务,但是他们只接受自己的服务,这里就涉及到了消息的分组

spring gateway filter redis异步写法 spring cloud 异步_队列_08

数码服务的接收方:

添加key属性,表名自己是哪一个服务

spring gateway filter redis异步写法 spring cloud 异步_队列_09

数码服务的接收方:

添加key属性,表名自己是哪一个服务

spring gateway filter redis异步写法 spring cloud 异步_分布式_10

消息发送方修改:

修改key为想发送的服务

spring gateway filter redis异步写法 spring cloud 异步_rabbitmq_11