1、初始MQ
1.1 微服务间通讯有同步和异步两种方式:
同步通讯:就像打电话,需要实时响应,时效性强,可以立即得到结果,耦合度高,
性能吞吐能力低,有级联失败问题,有额外的资源消耗,Feign就属于同步方式
异步通讯:就像微信发消息,不需要马上回复,异步调用可以避免上述问题
无需等待订阅者处理完成,响应更快速
服务之间不是直接调用,不存在级联失败问题
耦合度低,每个服务都可以灵活插拔,可替换
流量削峰,不管发送者发送消息的速率有多快,订阅者可以按照自己能接受的速度来处理消息
但是,异步通信架构复杂,不好管理
2、MQ的安装
MQ,简称消息队列,即存放消息的队列,
常见的MQ有:ActiveMQ、RabbitMQ、 RocketMQ、Kafka我们这里只针对RabbitMQ来说:
RabbitMQ中的一些角色:
publisher:生产者
consumer:消费者
exchange:交换机
queue:队列、存储消息
virtualHost:虚拟主机、一个虚拟主机可以存放一个租户的多个exchage、queue
来对不同租户的交换机和队列进行隔离
1、导入依赖:springboot-boot-starter-amqp
2、配置ynl文件:Spring:rabbitmq:host: 192.168.150.101
Spring:rabbitmq:port: 5672
virtual-host: / #虚拟主机
username: itcast
password: 123321
3、编写publisher消息发送 和 consumer消息接收(无交换机参与的最基本的发接操作)
因为RabbitMq是实现两个微服务之间的消息异步发送,所以在两个微服务之间
需要导入RabbitMq的依赖和yml配置
消息发送:
@Autowired
private RabbitTemplate rabbitTemplate;
rabbitTemplate.convertAndSend(队列名,消息内容);
消息接收:
类上标注@Component
@RabbitListener(queues="监听的队列名"
public void listener(String msg){ sout(msg); }
1、默认情况下,队列会把自己接收到的多条消息平均分配给监听它的消费者,这样会
导致能者无消息消费、弱者消息过多消费过慢
2、能者多劳:消费者每次只能获得一个消息,消费完了在给你一个
yml配置:spring:rabbitmq:listener:simple: prefetch: 1
4、发布/订阅
其中exchange交换机有三种类型:
Fanout:广播,将消息递交给所有与交换机绑定的队列
Direct:定向,将把消息递交给符合指定routing key的队列
Topic:通配符,与Direct类似,在routing key中可以指定通配符
#:匹配多个 *:匹配一个
5、加入交换机之后的消息的接发
第一种方式:
1、消息的发送还是注入@RabbitTemplate对象,调用convertAndSend方法来发送消息
rabbitTemplate.converAndSend(队列名,key名,消息内容)
//如果使用Fanout交换机来发送消息,没有key,可以在key的位置上写一个空字符串
2、消息的接收是通过声明@Bean的方式
在@Configuration配置类中,通过@Bean注解的方式声明交换机、队列、交换机和
队列的绑定关系
第二种方式:
1、消息的接收
通过@RabbitListener注解的方式来声明:队列名、交换机名和交换机类型、
和他们的绑定关系,以及key值
@RabbitListener(
bindings = @QueueBinding(value = @Queue(name = "direct.queue2"),
exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
key = {"red", "yellow"}
))
2、消息的发送
注入@RabbitTemplate
发送消息:rabbitTemplate.convertAndSend(队列名,key,消息内容)
6、用RabbitMQ来发送对象数据
1、 默认情况下,spring会把发送的消息序列化为字节发送到队列,接收消息的时候,
在反序列化为对象,不过spring采用的是jdk的序列化方式,数据体积大、可读性差
2、 我们用JSON转换器,来实现对象在MQ间的接发
需要在发送端 和 接收端 来分别倒入依赖:
1、jackson-dataformat-xml
2、在@Configuration配置类里面写一个@Bean方法
@Bean
public MessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
标签:队列,RabbitMQ,发送,交换机,消息,key From: https://www.cnblogs.com/jiaocha/p/16834379.html