微服务07_认识MQ以及RabbitMQ入门

用小例子开始今天的认识通信之路:

  • 同步通信:和妹子在微信上面进行视频聊天。
    优点是:能和妹子实时视频聊天。
    缺点是:不能和多个妹子同时视频。

  • 异步通信:和妹子在微信上面打字聊天。
    优点是:能和多个妹子同时聊天。 —【时间管理大师必备技能】

一、同步通信

1.耦合高问题

当开发完成后,突然需要添加业务【短信服务】。那么就得需要在支付服务进行改动代码。【本来调用feign接口调用订单服务、仓储服务即可】,那么就需要添加代码进行调用Feign接口短信服务。

2.性能下降.吞吐量下降、资源浪费、级联失败

用户调用支付业务,支付业务调用订单、仓储、短信…服务。
由于是同步通信:当支付服务调用订单服务时,得需要一直等待订单服务完成后【期间CPU、内存空闲状态–>资源浪费】,才可以进行调用仓储服务
50+150+150+150=500毫秒。
当调用订单服务时,订单服务挂掉了,那么支付服务会一直卡在订单服务这里,从而支付服务也不能调用其他服务。从而其他用户也访问不到所有的服务了。
在这里插入图片描述

总结:

同步调用的优点:

  • 时效性较强,可以立即得到结果
    例如:当查询订单,那么需要跟着用户信息,需要立马得到用户信息,那么就需要用同步调用。

同步调用的问题:

  • 耦合度高。【加新需要,需要修改原代码】
  • 性能和吞吐能力下降。【调用者需要等待服务提供者的响应】
  • 有额外的资源消耗。【不能释放请求占用的资源】
  • 有级联失败问题。【如果服务提供者出现问题,所有调用方都出现问题】

二、异步通信

异步调用则可以避免上述问题:
耦合度、吞吐量、资源消耗、级联失败。
发送方服务:用户
Broker:MQ
接收方服务:邮件、订单、库存等等服务

当用户请求支付服务,支付服务会给Broker发送信息,发送成功后,用户即可收到消息返回信息。
从而broker发布信息,所有订阅了broker的服务都可以接受到。一方面各个服务接收到消息后,会干自己的工作。
当新添加服务时,只需要定义broker即可。不需要改动其他代码。

在这里插入图片描述
为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)。发布者发布事件到Broker,不关心谁来订阅事件。订阅者从Broker订阅事件,不关心谁发来的消息。

在这里插入图片描述

1.耦合度低,解耦

同步通信:支付服务需要调用各个服务,所以增加短信功能时,需要改动源代码。

异步通信:支付服务只需要发送事件到Broker服务即可。Broker就会大喇叭吆喝一声【订阅服务】,通知各个订阅的服务。当新添加服务时,只需要订阅Broker即可。无论增加和介绍服务,都不需要改动代码。

2.性能提升、吞吐量提高

同步通信:支付服务要依次调用订单服务、库存服务、短信服务等等。那么每当调用时,都需要等待该服务完成后,才会去调用其他服务。从而造成CPU浪费、时间浪费。

异步通信:用户调用支付服务,支付服务向broker发送事件。然后支付服务就会立即告诉用户支付成功了。broker就会通知各个服务去了,
在这里插入图片描述

3.流量削锋【自己的优势】

当高并发来时,broker可以起到缓冲的作用。微服务,会根据自己的实力去broker获取事件,处理事件。从而为微服务起到保护作用。
在这里插入图片描述

好处:

  • 吞吐量提升:无需等待订阅者处理完成,响应更快速
  • 故障隔离:服务没有直接调用,不存在级联失败问题
  • 调用间没有阻塞,不会造成无效的资源占用
  • 耦合度极低,每个服务都可以灵活插拔,可替换。
  • 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

缺点:

  • 架构复杂了,业务没有明显的流程线,不好管理
  • 需要依赖于Broker的可靠、安全、性能

三、MQ常见框架

在这里插入图片描述

综上所看:国内用的比较多的是:RabbitMQ、RocketMQ、Kafka

  • RabbitMQ、RocketMQ:稳定性强,可靠性高,吞吐量还是可以的。适合对安全较高的业务通信。
  • RabbitMQ:对于中小企业没有对MQ深度定义的需求。更强调的是稳定和社区的活跃性。
  • RocketMQ:对于大企业需要更深度的定制。那么可以选择RocketMQ。基于java语言可以做自定义开发。
  • Kafka:吞吐能力非常高,可靠性较低,适合海量数据的传输,对于安全性不是很高的日志传输。

四、安装RabbitMQ

RabbitMQ是基于Erlang语言开发的开源消息通信中间件
官网地址:www.rabbitmq.com
Erlang语言:面向并发的开发语言,天生是为了分布式系统来设计的。
所以说RabbitMQ的性能、吞吐量还是可以的。而最善产的是:消息的可靠性、稳定性。系统的高可用。

1、我们在Centos7虚拟机中使用Docker来安装。

镜像获取:

方式一:在线拉取:docker pull rabbitmq:3-management
方式二:本地上传:mq.tar压缩包文件

1.开启docker服务,并命令加载镜像

//开启docker服务
[root@localhost tmp]# systemctl start docker
//查看docker是否开启成功:
[root@localhost tmp]# docker -v
Docker version 20.10.14, build a224086
// 将导入的.tar文件,使用命令加载镜像即可:
[root@localhost tmp]# docker load -i mq.tar 
Loaded image: rabbitmq:3-management
//查看都有哪些镜像:
[root@localhost tmp]# docker images
REPOSITORY                    TAG            IMAGE ID       CREATED         SIZE
rabbitmq                      3-management   95bc78c8d15d   21 months ago   187MB

2. 命令来运行MQ容器

//运行mq容器
docker run \
-e RABBITMQ_DEFAULT_USER=itcast \  #-e是给RabbitMQ设置环境变量,用户名和密码
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq \			# 容器的名字
--hostname mq1 \  #配置主机名字、集群部署一定要配置
-p 15672:15672 \    #端口映射--》管理平台的端口,提供UI界面
-p 5672:5672 \		# 消息通信的端口
-d \				# 后台运行
rabbitmq:3-management  # 镜像的名称
docker run \
 -e RABBITMQ_DEFAULT_USER=itcast \
 -e RABBITMQ_DEFAULT_PASS=123321 \
 --name mq \
 --hostname mq1 \
 -p 15672:15672 \
 -p 5672:5672 \
 -d \
 rabbitmq:3-management
[root@localhost tmp]# docker ps
[root@localhost tmp]# docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                                                                                                                                NAMES
aed40d206c9f   rabbitmq:3-management   "docker-entrypoint.s…"   5 minutes ago   Up 5 minutes   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp   mq

在这里插入图片描述

3.访问Linux的ip地址+端口进行访问UI页面:

  • Overview:总览。节点的相应信息
  • connections:连接。发送和接受都会进行连接
  • channels:操作MQ的工具。建立连接后一定会建立通道,生产者和消费者才会基于channels 进行消息的发送和接受。然而每一个连接者都会创建通道。
  • exchange:交换机。消息路由器。路由消息到队列中。
  • queues:队列。缓存消息
  • admin:管理。创建用户
  • can access virtual hosts:虚拟主机。各个虚拟主机之间是相互隔离的。不同的用户访问不同的虚拟主机
    在这里插入图片描述

2、RabbitMQ结构和概述

Publisher:消息的发送者
consumer:消息的消费者
那么消息发送者会把消息发送到exchange交换机,交换机负责路由,在将消息投递到队列,队列负责暂存消息,然后消费者再去队列中获取消息、处理消息。

在这里插入图片描述

五、消息模型介绍

1、基本、工作消息队列

发送和接受都是根据队列来完成。
在这里插入图片描述
根据消息队列模型来实现,三个角色:

  • publicsher:消息发送者,将消息发送到队列queue
  • queue:消息队列,负责接受并缓存消息
  • consumer:订阅队列,处理队列中的消息

2、发布订阅:广播、路由、主题队列

根据交换机类型不同分为三种:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值