专栏目录
0.docker快速入门
1.初识微服务
2.Gateway网关路由
3.Nacos配置管理
4.Sentinel微服务保护
5.Seata分布式事务管理
6.RabbitMQ消息队列
文章目录
MQ消息队列
微服务拆分后相互协作完成业务时,不可避免的要进行相互的通信调用,未完成这一需求,之前文章中使用的是基于OpenFeign的调用,属于同步通信;这种调用中调用者发起请求后必须等待服务提供者的返回结果才能执行后续业务
多种业务场景中一律使用同步通信会严重地影响性能,因此就涉及到了异步通信
同步通信就相当于在使用微信时的视频功能,一次性只能与一个人视频
异步通信相当于使用微信时发消息聊天,可以同时和多个人进行聊天且不需要等待他给你回消息
两种通信方式各有优劣,同步通信具有良好的实时性,相对的异步通信的延迟相对会较高,需要根据具体业务选中合适的通信方式。
1. 初识MQ
1.1 同步调用
基于OpenFeign的调用都属于是同步调用,但同步调用会存在一些问题:
一、拓展性差
随着业务规模扩大,产品的功能也在不断完善,每次有新的需求,现有逻辑都要跟着变化。
代码经常变动,不符合开闭原则,拓展性不好。
二、性能下降
采用同步调用,调用者需要等待服务提供者执行完返回结果后,才能继续向下执行。
也就是说每次远程调用,调用者都是阻塞等待状态。
最终整个业务的响应时长就是每次远程调用的执行时长之和
三、级联失败
基于OpenFeign调用服务时,一旦其中一个服务出现故障,整个事务都要回滚,这其实就是同步调用的级联失败问题。
1.2 异步调用
异步调用可以良好的解决同步调用所出现的三个问题,它采用基于消息通知的方式,一般包含三个角色:
- 消息生产/发送者:投递消息的人,就是原来的调用方
- 消息Broker:管理、暂存、转发消息,你可以把它理解成微信服务器
- 消息消费/接收者:接收和处理消息的人,就是原来的服务提供方
异步调用实现了发送消息和接收消息的完全解耦:在异步调用中,生产者不再直接同步调用消费者的业务接口,而是发送一条消息投递给消息Broker。然后消费者根据自己的需求从消息Broker那里订阅消息。每当发送方发送消息后,接受者都能获取消息并处理。
异步调用的优点:
- 耦合度更低
- 性能更好
- 业务拓展性强
- 故障隔离,避免级联失败
异步调用存在的缺点:
- 完全依赖于Broker的可靠性、安全性和性能
- 架构复杂,维护和调试麻烦
1.3 MQ的相关技术
RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
---|---|---|---|---|
公司/社区 | Rabbit | Apache | 阿里 | Apache |
开发语言 | Erlang | Java | Java | Scala&Java |
协议支持 | AMQP XMPP SMTP STOMP | OpenWire STOMP REST XMPP AMQP | 自定义协议 | 自定义协议 |
可用性 | 高 | 一般 | 高 | 高 |
单机吞吐量 | 一般 | 差 | 高 | 非常高 |
消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 |
消息可靠性 | 高 | 一般 | 高 | 一般 |
可用性:Kafka、 RocketMQ 、RabbitMQ
可靠性:RabbitMQ、RocketMQ
吞吐能力:RocketMQ、Kafka
消息低延迟:RabbitMQ、Kafka
2. RabbitMQ
2.1 相关地址
访问管理控制台:http://ip:15672
2.2 快速使用
①docker安装
docker run \
-e RABBITMQ_DEFAULT_USER=用户 \
-e RABBITMQ_DEFAULT_PASS=密码 \
-v mq-plugins:/plugins \
--name mq \
--hostname mq \
-p 15672:15672 \ # RabbitMQ提供的管理控制台的端口
-p 5672:5672 \ # RabbitMQ的消息发送处理接口
--network hm-net\
-d \
rabbitmq:3.8-management
②使用配置等默认登录信息登录进入控制台
在RabbitMQ中,
publicsher
通过exchange
进行消息路由,将消息投递到选中的queue
中,最后发给consumer
exchange、queue
存在于VirtualHost
中
publisher
:生产者,发送消息的一方consumer
:消费者,消费消息的一方queue
:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理exchange
:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列virtual host
:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的exchange、queue
2.3 收发消息
2.3.1 交换机
①进入控制台,选择交换机
②进入一个交换机详情,模拟交换机发送消息(交换机负责转发,不具备信息存储能力)
2.3.2 队列
①进入控制台,选择队列并添加队列
添加队列后并不能接收到交换机发来的消息,因为需要与其绑定
2.3.3 绑定
①在交换机选项卡中,选择目标交换机中的Bindings
菜单,绑定对应队列的名称
2.3.4 发送消息
一、经过绑定后,再从交换机模拟消息发送,就可以在对应队列查看到该消息
二、被绑定的队列接收到了消息
三、可以查看到消息内容
2.4 数据隔离
如果存在多个项目共用同一套MQ集群时,为防止项目之间互相干扰,会利用VirtualHost
的隔离特性,不同项目使用不同的账号以及VirtualHost
①创建新用户
但新用户并没有分配virtualhost
②登录新建用户
③创建新的virtual host