• 什么是RabbitMQ


    一、什么是RabbitMQ

    1.1 同步通讯和异步通讯

    • 同步通讯:就像打电话,需要实时响应。
    • 异步通信:就像发微信,不需要马上回复。

    两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发微信可以同时与多个人收发信息,但是往往响应会有延迟。

    学SpringCloud的时候,我们的Feign 其实就是同步通讯的,他其实有以下这几个缺点

    1. 耦合度高:(每次有新的需求,都需要更改代码)
    2. 性能下降:(消费者需要等待提供者响应,如果调用链过长,那么响应的时间等于每次调用的时间之和)
    3. 资源浪费:调用链中的每个服务在等待响应的过程中,不能释放请求占用的资源,高并发场景下,将极度浪费系统的资源。
    4. 级联失败:如果服务提供者出现问题,所有消费者都会跟着出问题,严重会导致整个微服务群故障。

    当然,同步调用(Feign)也有他的优点他的时效性很强,可以立即得到结果。

    异步调用就可以避免上述这些问题!

    我们以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,调用物流服务,从仓库分配响应的库存并准备发货。

    在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单id。

    订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可。

    为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)。发布者发布事件到Broker,不关心谁来订阅事件。订阅者从Broker订阅事件,不关心谁发来的消息。 如下图所示:

    在这里插入图片描述
    Broker 是一个像数据总线一样的东西,所有的服务要接收数据和发送数据都发到这个总线上,这个总线就像协议一样,让服务间的通讯变得标准和可控。

    优点:

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

    缺点:

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

    1.2 初识MQ

    MQ,全称是 Message Queue(消息队列),你可以简单理解为就是一个存放消息的队列。也就是事件驱动架构中的 Broker

    目前比较常见的MQ的实现有以下四种:RabbitMQActiveMQRocketMQKafka

    RabbitMQActiveMQRocketMQKafka
    公司/社区RabbitApache阿里Apache
    开发语言ErlangJavaJavaScala&Java
    协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMP,REST,XMPP,AMQP自定义协议自定义协议
    可用性一般
    单机吞吐量一般非常高
    消息延迟微秒级毫秒级毫秒级毫秒以内
    消息可靠性一般一般

    目前国内使用比较多的是:RabbitMQRocketMQ 以及 Kafka
    那么,如何选择我们应该用哪一个呢?从上面的表格可以看出来,他们是互有优缺点的。假设你需要很高的吞吐量,但是,对消息的延迟以及完整性(可靠性)要求不高的话,那么肯定首选Kafka。

    • 追求可用性:Kafka、 RocketMQ 、RabbitMQ
    • 追求可靠性:RabbitMQ、RocketMQ
    • 追求吞吐能力:RocketMQ、Kafka
    • 追求消息低延迟:RabbitMQ、Kafka

    下面,我们以RabbitMQ为例,简单介绍并给出详细的下载教程!!!

    1.3 RabbitMQ的下载

    RabbitMQ是基于Erlang语言 开发的开源消息中间件,官网地址:https://www.rabbitmq.com

    如果想要更好地学习RabbitMQ,首推官网的文档进行学习,就是这个位置:
    在这里插入图片描述
    下面介绍一下CentOS 7 怎么下载RabbitMQ。命令如下:

    docker pull rabbitmq:3-management
    

    这是最简单的方式,直接使用我们的Docker进行下载即可。不熟悉的Docker的小伙伴可以看我的Docker专栏快速入门啊。

    下载完成后,我们使用命令docker images查看我们的镜像是否下载成功。(3-management是有管理平台的,3是没有的
    在这里插入图片描述

    然后我们启动我们的容器,命令如下:

    docker run \
    -e RABBITMQ_DEFAULT_USER=admin \
    -e RABBITMQ_DEFAULT_PASS=root \
    --name mq \
    --hostname mq1 \
    -p 15672:15672 \
    -p 5672:5672 \
    -d \
    rabbitmq:3-management
    

    解释一下:

    • docker run:启动容器
    • -e RABBITMQ_DEFAULT_USER=admin:配置RabbitMQ管理平台的账号
    • -e RABBITMQ_DEFAULT_PASS=root:配置RabbitMQ管理平台的密码
    • –name mq:给容器取个名字
    • –hostname mq1:集群部署的时候需要用到
    • -p 15672:15672:配置管理平台的端口号映射
    • -p 5672:5672:配置请求响应的端口号映射
    • -d:后台执行
    • rabbitmq:3:以rabbitmq:3镜像文件创建容器

    启动完成后,使用命令docker ps可以查看我们目前启动的容器如下:
    在这里插入图片描述
    然后,我们还得启动防火墙:

    firewall-cmd --add-port=5672/tcp --permanent --zone=docker
    firewall-cmd --add-port=15672/tcp --permanent --zone=docker
    firewall-cmd --reload
    

    完成后,我们输入虚拟机或者你的云服务器的ip地址加端口号(15672),比如,192.168.10.20:15672,可以看到rabbitMQ管理平台登录页面如下:
    在这里插入图片描述
    账号密码刚才我们设置为admin和root了。输入后直接登录就可以了。

    进去后,我们首先看到的Overview就是我们的RabbitMq的总览,由于没有配置集群,所以下面只有一个mq1,mq1这个名字也是我们刚才在docker上配置的(–hostname mq1)。
    在这里插入图片描述
    第二个菜单项Connection(连接),要把RabbitMQ作为Broker,我们的服务当然要与我们的RabbitMQ建立连接。
    在这里插入图片描述
    第三个菜单项Channels(通道),建立连接后,我们必须创建我们的通道,让我们的生产者和消费者可以在上面收发信息。
    在这里插入图片描述
    第四个菜单项Exchanges(交换机),实现的是类似我们路由的功能。
    在这里插入图片描述
    第五个菜单项Queue(队列),用来做我们的消息存储。
    在这里插入图片描述
    第六个菜单项Admin(管理),用来管理我们的用户信息。目前只有我们当前登录的用户。
    在这里插入图片描述
    如果想要创建一个新的用户也很简单,下面有一个Add a user,点一下,输入我们的账号密码,然后给他定位一个角色就行了。
    在这里插入图片描述
    创建成功后,我们的新用户,可以看到,他是没有任何可以访问的虚拟主机的。
    在这里插入图片描述
    虚拟主机的创建如下:
    点击右侧的Virtual Hosts,然后点击Add a virtual host,输入我们的虚拟主机路径,然后点击添加按钮就行了。虚拟主机与虚拟主机之间的关系类似于名称空间,是彼此独立的。
    在这里插入图片描述
    如果此时,我们要给某个用户分配一个虚拟主机,那么,我们只需要点击我们用户的Name。
    在这里插入图片描述
    选择要分配给他的虚拟主机,然后点击Set permission 按钮即可。
    在这里插入图片描述
    点击后,我们可以看到,上面的Current permissions多了一个叫 / 的虚拟主机,如果要别的也可以添加。
    在这里插入图片描述
    退出来后,我们也可以看到,Keeling多了一个可以访问的虚拟主机 / 。
    在这里插入图片描述
    RabbitMq的架构如下:
    在这里插入图片描述
    1、服务的提供者将消息发送给我们的交换机
    2、交换机再把消息发送到我们的Queue队列中
    3、然后队列再把接收到的消息发送给我们的消费者。
    期间,虚拟主机与虚拟主机的消息和路由是完全独立,互不干扰的

  • 相关阅读:
    MFC入门基础(十二)控件 CScrollBar的使用
    VSCode自动分析代码的插件
    【JavaEE初阶】进程篇
    C++实现一个线程池
    解读 | 快速精确的体素GICP三维点云配准算法
    大二Web课程设计——张家界旅游网站设计与实现(HTML+CSS+JavaScript)
    LeetCode 0257. 二叉树的所有路径
    python面向对象
    矩阵分析与计算学习记录-矩阵函数
    【VMware16 安装 Centos7 并配置固定IP】
  • 原文地址:https://blog.csdn.net/weixin_44741023/article/details/127097005