微服务-消息驱动Spring Cloud Stream

微服务-消息驱动Spring Cloud Stream,第1张

微服务-消息驱动Spring Cloud Stream 1. 什么是SpringCloudStream

→官网 , 官网doc , Spring Cloud Stream中文指导手册
Spring Cloud Stream是一个构建事件消息驱动的微服务框架, 提供了灵活的编程模型。它构建在SpringBoot上,提供了Kafka,RabbitMQ等消息中间件的个性化配置,引入了发布订阅、消费组和分区的核心概念.

2. 为什么使用Spring Cloud Stream 2.1 问题场景

在实际开发过程中,服务与服务之间通信经常会用到消息中间件, 比如RabbitMQ等,使得中间件和系统之间的耦合很高,如果后面又要替换为 Kafka 变动会很大.
比如 RabbitMQ 和 Kafka ,这两个消息中间件架构上有很大不同,RabbitMQ 有exchange,而 kafka 有 Topic 和 Partitions 分区.

Spring Cloud Stream方案可以整合我们的消息中间件,降低系统和中间件的耦合。(目前仅支持RabbitMQ、Kafka)

简单理解, 就是屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型.

2.2 解决什么问题

无感知的使用消息中间件
Stream解决了开发人员无感知的使用消息中间件的问题,因为Stream对消息中间件的进一步封装,可以做到代码层面对中间件的无感知。有效简化开发人员对MQ使用的复杂度,使更多的精力投入到核心业务的处理。

中间件和服务的高度解耦
Spring Cloud Stream进行了配置隔离,开发中只需要调整配置,就可以动态的切换中间件(如rabbitmq切换为kafka),使得微服务开发高度解耦,服务可以更多的关注自己的业务流程。

2.3 Spring Cloud Stream凭什么可以统一底层差异

在没有绑定器这个概念的情况下,SpringBoot应用要直接与消息中间件进行信息交互,由于各消息中间件构建的初衷不同,它们的实现细节上会有较大的差异性,通过定义绑定器(Binder)交互中间层,完美地实现了应用程序与消息中间件细节之间的隔离。Spring Cloud Stream对消息中间件的进一步封装,可以做到代码层面对中间件的无感知,甚至于动态的切换中间件(rabbitmq切换为kafka),使得微服务开发的高度解耦,服务可以关注更多自己的业务流程.

3. Stream应用模型 3.1 模型原理

Spring Cloud Stream由一个中立的中间件内核组成。Spring Cloud Stream会注入输入和输出的channels,应用程序通过这些channels与外界通信,而channels则是通过一个明确的中间件Binder与外部brokers连接。

应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream中binder对象交互。通过配置binding来绑定具体的binder对象 ,而Spring Cloud Stream的binder对象负责与消息中间件交互。所以,我们只需要搞清楚如何与 Spring Cloud Stream 交互就可以方便的使用消息驱动.

3.2 模型解读 3.2.1 Middleware

消息中间件, 目前仅支持RabbitMQ、Kafka. 目前流行的RocketMQ可以使用SpringCloudAlibaba整合.

3.2.2 Binder

Binder 是 Spring Cloud Stream 的一个抽象概念,是应用与消息中间件之间的粘合剂。目前 Spring Cloud Stream 提供了 Kafka 和 RabbitMQ 的binder实现。

Binder可以看成适配器,用来将Stream与中间连接起来,不同的Binder对应不同的中间件. 可以动态的改变消息的destinations, 需要我们修改外部配置项. 甚至可以任意的改变中间件的类型而不需要修改一行代码。

3.3.2 Bindings

Bindings, 是我们通过配置把应用和spring cloud stream 的 binder 绑定在一起,之后我们只需要修改 binding 的配置来达到动态修改消息的destination(对应 Kafka 的topic,RabbitMQ 的 exchanges)而不需要修改一行代码。

Binder生成Binding,Binding用来绑定消息驱动的生产者和消费者,它有两种类型,INPUT和OUTPUT,INPUT是消费者,OUTPUT是生产者。

3.2.4 Application Core

由Stream封装的消息机制,很少自定义开发.

3.2.5 channels

inputs 输入通道,可以自定义开发;
outputs 输出通道,可以自定义开发.
编码API和常用注解

3.2.6 分区支持

Spring Cloud Stream支持在一个应用程序的多个实例之间数据分区,在分区的情况下,物理通信介质(例如,topic代理)被视为多分区结构。一个或多个生产者应用程序实例将数据发送给多个消费应用实例,并保证共同的特性的数据由相同的消费者实例处理。

Spring Cloud Stream提供了一个通用的抽象,用于统一方式进行分区处理,因此分区可以用于自带分区的代理(如kafka)或者不带分区的代理(如rabbiemq).

分区在有状态处理中是一个很重要的概念,其重要性体现在性能和一致性上,要确保所有相关数据被一并处理,例如,在时间窗平均计算的例子中,给定传感器测量结果应该都由同一应用实例进行计算。

4. 最佳实践

待补充

个人博客

欢迎访问个人博客: https://www.crystalblog.xyz/

备用地址: https://wang-qz.gitee.io/crystal-blog/

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5635406.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存