Spring Cloud Bus 设计原理
本节将介绍Spring Cloud Bus的设计原理。理解原理有利于更好地基于Spring Cloud Bus来进行二次开发。
基于Spring Cloud Stream
Spring Cloud Bus是基于Spring Cloud Stream基础之上而做的封装。Spring Cloud Stream是Spring Cloud家族中一个构建消息驱动微服务的框架。
图16-3所示的是来自官方的Spring Cloud Stream应用模型。
在该应用模型中可以发现Spring Cloud Stream的几个核心概念。
1.Spring Cloud Stream Application
Application通过inputs或outputs来与SpringCloud Stream中的 Binder交互,通过配置来binding,而Spring Cloud Stream的 Binder负责与中间件交互。所以只需要搞清楚如何与Spring Cloud Stream交互就可以方便使用消息驱动的方式。
2.Binder
Binder是Spring Cloud Stream 的一个抽象概念,是应用与消息中间件之间的黏合剂。目前Spring Cloud Stream实现了Kafka和 Rabbit等消息中间件的 Binder。
通过Binder,可以很方便地连接消息中间件,可以动态地改变消息的destinations(对应于Kaf-ka 的 topic,Rabbit 的exchanges),这些都可以通过外部配置项做到。通过配置,不需要修改一行代码,就能实现消息中间件的更换。
3.订阅/发布
消息的发布(Publish)和订阅(Subscribe)是事件驱动的经典模式,如图16-4所示。SpringCloud Stream的数据交互也是基于这个思想。生产者把消息通过某个topic广播出去(Spring CloudStream 中的destinations)。其他的微服务通过订阅特定topic来获取广播出来的消息,以触发业务的进行。
这种模式极大地降低了生产者与消费者之间的耦合。即使有新的应用引入,也不需要破坏当前系统的整体结构。
4.消费者分组
Spring Cloud Stream的意思基本与Kafka一致。为了防止同一个事件被重复消费,只要把这些应用放置于同一个“group”中,就能够保证消息只会被其中一个应用消费一次。
5.持久化
消息事件的持久化是必不可少的。Spring Cloud Stream可以动态地选择一个消息队列是否需要持久化。
6.Binding
Binding 是通过配置把应用与Spring Cloud Stream的 Binder绑定在一起的,之后只需要修改Binding 的配置来达到动态修改topic、exchange、type等一系列信息,而不需要修改一行代码。
7.分区支持
Spring Cloud Stream支持在给定应用程序的多个实例之间对数据进行分区。在分区方案中,物理通信介质(如topic)被视为多个分区。
Spring Cloud Stream为统一实现分区处理用例提供了一个通用抽象。无论代理本身是自然分区(如Kafka)还是非自然分区(如RabbitMQ),都可以使用分区。
Spring Cloud Bus的编程模型
当微服务之间需要通信时,先将消息传递给消息总线,而其他微服务实现接收消息总线分发信息。Spring Cloud Bus提供了简化微服务发送和接收消息总线指令的能力。
1.AbstractBusEndpoint及其子类
通过这个接口来实现用户的访问,都需要继承AbstractBusEndpoint。
以下是AbstractBusEndpoint.java的核心代码。
最常用的AbstractBusEndpoint 的子类,莫过于EnvironmentBusEndpoint和RefreshBusEndpoint。
这两个类分别实现了/bus/env和/bus/refresh的HTTP接口。
以下是 EnvironmentBusEndpoint.java的源码。
以下是RefreshBusEndpoint.java的源码。
2.RemoteApplicationEvent及其子类
RemoteApplicationEvent用来定义被传输的消息事件。
以下是RemoteApplicationEvent.java的源码。
最常用的RemoteApplicationEvent的子类,莫过于EnvironmentChangeRemoteApplicationEvent和RefreshRemoteApplicationEvent。
以下是EnvironmentChangeRemoteApplicationEvent.java的源码。
以下是RefreshRemoteApplicationEvent.java的源码。
3.ApplicationListener及其子类
ApplicationListener是用来处理消息事件的监听器,是Spring框架的核心接口。该接口只有一个方法。
Spring Cloud Bus中的监听器都需要实现该接口。EnvironmentChangeListener及RefreshListener是其中两个常用的实现类。
以下是 EnvironmentChangeListener.java的源码。
以下是RefreshListener.java的源码。
本篇文章内容给大家讲解的是SpringCloudBus 设计原理
下篇文章给大家讲解的是如何集成 BuS;
觉得文章不错的朋友可以转发此文关注小编;
感谢大家的支持!
领取专属 10元无门槛券
私享最新 技术干货