在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费, 所以称它为消息总线

在总线上的各个实例都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息,例如配置信息的变更或者其他一些管理操作等。由于消息总线在微服务架构系统中被广泛使用,所以它同配置中心一样,几乎是微服务架构中的必备组件。Spring Cloud 作为微服务架构综合性的解决方案,对此自然也有自己的实现,即 Spring Cloud Bus。 通过使用 Spring Cloud Bus,可以非常容易地搭建起消息总线,同时实现一些消息总线中的常用功能, 比如配合 Spring Cloud Config 实现微服务应用配置信息的动态更新等。

消息代理

消息代理 (Message Broker) 是一种消息验证传输路由的架构模式。它在应用程序之间起到通信调度最小化应用之间的依赖的作用,使得应用程序可以高效地解耦通信过程

在整个生产消费过程中,生产和消费是一个异步操作,这也是在分布式系统中要使用消息代理的重要原因,所以可以使用通信解耦业务逻辑。通过生产消费模式的异步操作,系统间调用就没有同步调用需要那么高的实时性要求,同时也更容易控制处理的吞吐量以保证系统的正常运行等。

消息代理是一个中间件产品,它的核心是一个消息的路由程序,用来实现接收和分发消息,并根据设定好的消息处理流来转发给正确的应用。它包括独立的通信和消息传递协议,能够实现组织内部和组织间的网络通信。 设计代理的目的就是为了能够从应用程序中传入消息,并执行一些特别的操作,下面这些是在企业应用中,经常需要使用消息代理的场景:

  • 将消息路由到一个或多个目的地

  • 消息转化为其他的表现方式。

  • 执行消息的聚集、消息的分解,并将结果发送到它们的目的地,然后重新组合响应返回给消息用户。

  • 调用 Web 服务来检索数据。

  • 响应事件或错误。

  • 使用发布 - 订阅模式来提供内容或基于主题的消息路由。

目前已经有非常多的开源产品可供使用, 如:ActiveMQ、Kafka、RabbitMQ、RocketMQ。

AMQP

AMQP, Advanced Message Queuing Protocol,它是一个面向消息中间件的开放式标准应用层协议。它定义了以下这些特性:

  • 消息方向

  • 消息队列

  • 消息路由(包括点到点和发布-订阅模式)

  • 可靠性

  • 安全性

AMQP 要求消息的提供者和客户端接收者的行为要实现对不同供应商可以用相同的方式(比如SMTP、HTTP、FTP等)进行互相操作。在以往的中间件标准中,主要还是建立在 API 级别,如 JMS,集中于通过不同的中间件实现来建立标准化的程序间的互操作性,而不是在多个中间件产品间实现互操作性。

AMQP 与 JMS 不同,JMS 定义了一个 API 和一组消息收发必须实现的行为,而 AMQP 是一个线路级协议。 线路级协议描述的是通过网络发送的数据传输格式。因此任何符合该数据格式的消息发送和接收工具都能互相兼容和进行操作,这样就能轻易实现跨技术平台的架构方案。

RabbitMQ 实现消息总线

RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件,也称为面向消息的中间件。RabbitMQ 服务器是用高性能、可伸缩而闻名的 Erlang 语言编写而成的,其集群和故障转移是构建在开放电信平台框架上的。

RabbitMQ 实现了 AMQP 协议,所以它可以支持多种操作系统、多种编程语言,几乎可以覆盖所有主流的企业级技术平台。在微服务架构消息中间件的选型中,它是一个非常适合且优秀的选择。因此在 Spring Cloud Bus 中默认包含了对 Rabbit 的自动化配置。

RabbitMQ 基本概念

  • Broker: 可以理解为消息队列服务器的实体,它是一个中间件应用,负责接收消息生产者的消息,然后将消息发送至消息接收者或者其他的 Broker。

  • Exchange: 消息交换机,是消息第一个到达的地方,消息通过它指定的路由规则,分发到不同的消息队列中去。

  • Queue: 消息队列,消息通过发送和路由之后最终到达的地方,到达 Queue 的消息即进入逻辑上等待消费的状态。每个消息都会被发送到一个或多个队列。

  • Binding: 绑定,它的作用就是把 Exchange 和 Queue 按照路由规则绑定起来,也就是 Exchange 和 Queue 之间的虚拟连接。

  • Routing Key: 路由关键字,Exchange 根据这个关键字进行消息投递。

  • Virtual host: 虚拟主机,它是对 Broker 的虚拟划分,将消费者、生产者和它们依赖的 AMQP 相关结构进行隔离,一般都是为了安全考虑。比如,可以在一个 Broker 中设置多个虚拟主机,对不同用户进行权限的分离。

  • Connection: 连接,代表生产者、消费者、Broker 之间进行通信的物理网络。

  • Channel: 消息通道,用于连接生产者和消费者的逻辑结构。在客户端的每个连接里,可建立多个 Channel,每个 Channel 代表一个会话任务,通过 Channel 可以隔离同一 连接中的不同交互内容。

  • Producer: 消息生产者,制造消息并发送消息的程序。

  • Consumer: 消息消费者,接收消息并处理消息的程序。

消息投递到队列的整个过程大致如下:

  1. 客户端连接到消息队列服务器,打开一个 Channel。

  2. 客户端声明一个 Exchange,并设置相关属性。

  3. 客户端声明一个 Queue, 并设置相关属性。

  4. 客户端使用 Routing Key, 在 Exchange 和 Queue 之间建立好绑定关系。

  5. 客户端投递消息到 Exchange。

  6. Exchange 接收到消息后,根据消息的 Key 和已经设置的 Binding,进行消息路由,将消息投递到一个或多个Queue 里。

Exchange 有以下类型:

  1. Direct 交换机:完全根据 Key 进行投递。比如,绑定时设置了 Routing Key 为 abc,那么客户端提交的消息,只有设置了 Key 为 abc 的才会被投递到队列。
  2. Topic 交换机:对 Key 进行模式匹配后进行投递,可以使用符号#匹配一个或多个词符号*匹配正好一个词。如 abc.# 匹配 abc.def.ghi,abc.* 只匹配 abc.def。
  3. Fanout 交换机:不需要任何 Key,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。

RabbitMQ 支持消息的待久化,也就是将数据写在磁盘上。为了数据安全考虑,大多数情况下都会选择持久化。消息队列持久化包括3个部分:

  1. Exchange 持久化,在声明时指定 durable => 1。
  2. Queue 持久化,在声明时指定 durable => 1。
  3. 消息持久化,在投递时指定 delivery_mode => 2 (1是非持久化)。

如果 Exchange 和 Queue 都是持久化的,那么它们之间的 Binding 也是持久化的。

如果 Exchange 和 Queue 两者之间有一个是持久化的,一个是非持久化的,就不允许建立绑定。

参考:

《Spring Cloud 微服务实战》翟永超 著

Spring Cloud Bus 消息总线相关推荐

  1. Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)

    上一篇文章,留了一个悬念,Config Client 实现配置的实时更新,我们可以使用 /refresh 接口触发,如果所有客户端的配置的更改,都需要手动触发客户端 /refresh ,当服务越来越多 ...

  2. Spring Cloud Bus 消息总线介绍

    作者 | 洛夜 来源 | 阿里巴巴云原生公众号 在 Spring 生态中玩转 RocketMQ 系列文章: <如何在 Spring 生态中玩转 RocketMQ?> <罗美琪和春波特 ...

  3. 干货|Spring Cloud Bus 消息总线介绍

    2019独角兽企业重金招聘Python工程师标准>>> 继上一篇 干货|Spring Cloud Stream 体系及原理介绍 之后,本期我们来了解下 Spring Cloud 体系 ...

  4. Spring Cloud Bus 消息总线实现配置自动刷新

    why 当微服务太多的时候,服务之间需要建立通信或一个服务的改变需要广播到所有其它服务,这时就需要有一个总线来承担对应的职责. what spring cloud bus 是通过轻量消息代理连接各个分 ...

  5. Spring Cloud Bus消息总线

    目录 一.概述简介 1.1. Bus是什么 1.2. Bus能干嘛 1.3. 为何被称为总线 二.RabbitMQ环境配置 2.1. windows下载与安装 2.2. 使用RabbitMQ 三.Bu ...

  6. Spring Cloud Bus + RabbitMq 自动刷新

    2019独角兽企业重金招聘Python工程师标准>>> 最近两天在鼓捣Spring Cloud Bus消息总线的刷新机制问题,探索的路程总是坎坷的,一些坑是逃不掉的,总算将其大概了解 ...

  7. 原 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f8-bus/ 本文出自方志朋的博客 转载请标明出处: Spr ...

  8. 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)

    首先:欢迎各位学习java和大数据的程序员朋友们加入Java交流学习群: 721506929,群内提供免费的架构学习资料,有需要的朋友可以进群来学习. https://www.fangzhipeng. ...

  9. 消息总线(Spring Cloud Bus)

    spring CloudBus 将分布式的节点和轻量的消息代理连接起来.这可以用于广播配置文件的更改或者其他的管理工作.一个关键的思想就是,消息总线可以为微服务做监控,也可以作为应用程序之间相互通讯. ...

最新文章

  1. AMD and CMD are dead之js模块化黑魔法
  2. Business Contact Mnanager for Outlook2010之二:常用基本功能
  3. dockerfile各种命令解析
  4. pinctrl虚拟spi的linux驱动,linux内核pinctrl驱动的理解和总结
  5. kill进程_你还在使用kill -9 杀进程吗?从原理谈避免踩雷!
  6. 一个form 如何做两次提交_如何做一个调酒师
  7. 覆盖索引与联合索引_MySQL:你知道什么是覆盖索引吗?
  8. app逆向 安卓开发环境搭建
  9. Excel控制AutoCad进行坐标标注
  10. IDEA 使用Tomcat热部署
  11. OSEK间接网络管理(NM)
  12. 计算机组装与系统维护技术,计算机组装与系统维护技术.pdf
  13. 从 SEC EDGAR 获取股东治理数据 (Shareholder Activism)
  14. 162天,从华为外包5k转岗正式员工15k,心酸只有自己知道
  15. vue中获取本地内网ip
  16. 样条曲线(下)之插值问题(贝塞尔曲线、B样条和一般样条曲线插值)
  17. 用C语言编写程序计算对角线的和,C语言入门级代码 计算二维数组主对角线上的元素之和...
  18. 【看表情包学Linux】进程创建 | 进程终止 | 分叉函数 fork | 写时拷贝 | 内核数据结构缓冲池 | slab 分派器
  19. Kaggle泰坦尼克号船难--逻辑回归预测生存率
  20. 计算机视觉注意力网络(三)——CBAM [ECCV 2018]

热门文章

  1. C语言中的%d、%u、%p、%f、%lu...
  2. 【模电】0015 线性稳压电源的原理及分析
  3. fifo的rdata_FIFO的使用总结
  4. IO模型(阻塞,非阻塞,多路复用......)
  5. linux查找表空间使用情况,表空间的使用情况查询及管理
  6. 微信公众平台测试号申请
  7. 计算机专业实训报告总结
  8. mapDispatchToProps的三种方式mapStateToProps
  9. IDEA高效使用技巧--->IDEA批量修改变量快捷键和全局搜索键
  10. XP下硬盘安装fedora linux操作系统