【SpringCloud】6.RabbitMQ消息队列

专栏目录
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的相关技术

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&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

在这里插入图片描述
在这里插入图片描述

④新用户就分配了新的virtual host,实现了数据的隔离

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值