系列文章|云原生时代下微服务架构进阶之路 - Spring Cloud Stream
通过本篇文章您可以了解到以下内容:
- 回顾
- Spring Cloud Stream 简介
- Spring Cloud Stream 深入介绍
- 总结
往期 · 推荐
首先让我们做一个简单的回顾:
在上一篇文章中我们深入的了解了 Spring Cloud。我们知道 Spring Cloud 提供了一系列开箱即用的组件,开发者只需要通过配置简单的注解以及编写少量的 yaml 就可以完成快速开发的工作。
这些组件解决的是微服务架构中常见的、共性的一些问题,比如网关、负载均衡、监控、应用层面的高可用(熔断、降级、限流)。但是我们会发现这些解决方案中并不包括对消息中间件的解决方案。例如有的项目使用Kafka,有的项目使用 RabbitMQ 等等,那么对于这些消息中间件的整合,Spring Cloud 又会给出怎样的解决方案呢? 这时候 Spring Cloud Stream 就登场了。
Spring Cloud Stream简介
在文章的开始,首先让我们看看官方对于Spring Cloud Stream 的定义和介绍:
通过上述的介绍,不难看出,首先 Spring 关于对数据的集成是始于 Spring Integration 项目的。通过其编程模型,提供了对开发人员来说一致的开发体验。
但是在云时代下,微服务架构就变的尤为重要,几乎所有的 Java 开发人员都会使用 Spring Boot 作为微服务开发框架的首选。
此外在现有项目 Spring Integration 的基础上进行再次封装,并与 Spring Boot 体系进行融合,也就形成了一个新的项目,即 Spring Cloud Stream。
通过 Spring Cloud Stream 开发者又会具备哪些优势呢?
- 独立,隔离似的构建、测试和部署以数据为中心的应用程序。
- 应用现代微服务架构模式,包括通过消息传递的组合。
- 将应用程序职责与以事件为中心的思想分离。事件可以表示及时发生的事情,下游消费者应用程序可以对其做出反应,而不知道事件的起源或生产者的身份。
- 将业务逻辑移植到消息代理上(例如RabbitMQ, Apache Kafka, Amazon Kinesis)。
- 依赖于框架对常见用例的自动内容类型支持。使得扩展到不同的数据转换类型变得可能。
通俗一点来讲,比如在我们实际生产的业务系统中用到了 Kafka 和 RabbitMQ 等组件,众所周知的是 Kafka 和RabbitMQ 这两个消息中间件在架构上是不尽相同的。举个例子,如果因为业务需要,将现有的 Kafka 迁移到RabbitMQ 那么势必会面临大量代码以及配置修改的问题。这无疑对于开发人员来说是非常复杂的。而 Spring Cloud Stream 的出现恰恰很好的解决了这个问题。
Spring Cloud Stream 是一个构建消息驱动微服务的框架。对应的应用程序中需要通过 Inputs 亦或 Outputs 来与Spring Cloud Stream 中的 Binder 进行交互即可。
通过指定对应消息中间件例如 kafka 或者 RabbitMQ 的 Binder 实现与外部代理链接,业务开发人员可以不再关注具体消息中间件,只需要关注 Binder 提供的抽象概念来使用与之对应的消息中间件即可。
Spring Cloud Stream深入介绍
首先让我们对 Spring Cloud Stream 的核心概念有一个全面的认知:
Destination Binder
负责提供与外部消息传递系统集成的组件。
Binding
外部消息传递系统和应用程序提供的消息生产者和消费者(由目标绑定器创建)之间的桥梁。
从上图中可以看出,Binding 等同于连接应用程序和消息中间件的桥梁,用于生产消息和对消息进行消费。
在没有 Binding 时,我们使用 Spring Boot 应用要直接与消息中间件直接打交道,通过 Bingding 作为中间层,可以完美实现了应用程序与消息中间件细节的隔离和屏蔽。Spring Cloud Stream 对消息中间件进行了进一步的封装,可与做到代码层面的无感知,可以使得开发者动态切换消息中间件(例如从 Kafka 切换到 RabbitMQ)这样就做到了高度解耦,使得每一个服务更加关注自己的业务流程。此外 Input 对应消费者,Output 对应生产者。
Message
这个相对好理解,即生产者和消费者用于与目标绑定器(以及通过外部消息传递系统与其他应用程序)通信的规范数据结构。
接下来让我们看下 Spring Cloud Stream 架构以及常用注解:
@EnableBinding
该注解本身使用 @Configuration 进行元注释,触发 Spring Cloud Stream 基础架构的配置。
@StreamListner
用于消费者的队列进行消息的接收。
Middleware
消息中间件,可以理解为 RabbitMQ 或者 Kafka 等。
此注解表示输入的管道,即通过该输入管道接收到消息。
此注解表示输出的管道,即发布的消息通过此管道从该应用程序发送出去。
除了以上注解以外,Spring Cloud Stream 有两种消费类型,分别是推送模式,以及拉取模式。
推送模式
一旦新的消息出现,会立即发送给消费者。
拉取模式
消费者会主动从消息中间件拉取消息,此场景适用于如果希望控制消息的消费速度。
再了解完消息的消费类型以后,让我们看看关于 Spring Cloud Stream 对分区方面的支持,这里面值得注意的是,无论整合的中间件是否支持分区,例如 Kafka 本身支持分区。Spring Cloud Stream 中都能够使用分区的功能,这里 Spring Cloud Stream 对各种分区实现做出了抽象的处理。它会将消息传递给媒介,例如 Kafka 的 Topic,对于RabbitMQ 就是 Exchange。
值得注意的是,在使用分区处理的时候,需要同时对 Producer 端和 Consumer 端进行配置。
与此同时在 Spring Cloud Stream 中也存在消费组的概念。对于处于同一消费组中的多个应用出现争抢时,那么该消息只会被消费组中的一个实例消费。
我们可以通过 spring.cloud.stream.bindings..group 参数来声明当前应用所属的消费组。当然如果不进行设置,Spring Cloud Stream 会默认创建一个。
最后关于 Spring Cloud Stream 的例子,大家可以参考如下链接:
总结
回顾全篇内容,整体包括以下内容:
- 首先在开篇我们对 Spring Cloud 组件进行了回顾。
- 其次对 Spring Cloud Stream 进行了宏观的介绍,包括该项目的由来,解决了什么问题等。
- 对 Spring Cloud Stream 进行了深入介绍。
参考链接:
1.https://spring.io/projects/spring-cloud-stream
2.https://github.com/spring-cloud/spring-cloud-stream-samples
内容来源|公众号:VMwareTanzu 云原生

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
TIOBE 11 月榜单:Rust 保住地位,少儿编程语言 Scratch 进入 TOP 20
TIOBE 公布了 2022年 11 月的编程语言排行榜。 近期热门的Rust 编程语言在 10 月份以 0.70% 的历史最高市场份额再次进入了榜单前 20 名,并在一个月过后成功保住了Top 20 的位置。TIOBE CEOPaul Jansen评价称: 关注有前途的新编程语言总是一件很有趣的事,这是因为它们都有可能成为下一个主流语言,没有人愿意错过。但不幸的是,这些新语言大多在短时间内受到关注,却从未有真正的突破。多年来,我们一直在等待 Kotlin、Dart、Julia 等语言努力进入 TIOBE 指数前 20 名,但它们都没有成功。唯一的例外似乎是 Rust。Rust 在上个月进入了前 20 名,并在这个月成功保持了它的位置。Rust 受欢迎程度上升的主要原因是其速度和安全的独特组合。让我们看看 Rust 是否会继续存在。 TIOBE 11月 TOP 20 编程语言 相较上月,Top10 中PHP(9→10)和 SQL(10→9)再次出现了排名互换;其他语言排名不变。 Top11-20 间仍小波动不断。值得一提的是,少儿编程语言 Scratch从上月的第 23 名上升至了榜单...
- 下一篇
系列文章|云原生时代下微服务架构进阶之路 - Spring Native
通过本篇文章您可以了解到以下内容: Spring Native简介 Spring Native深入剖析 总结 Spring Native简介 当我们看到Spring Native这个词语的时候,是不是会有诸多疑问?比如什么是Spring Native,它是用来解决什么问题的?它和我们现在已经熟知的Spring Boot以及Spring Cloud又有什么联系呢? 接下来就让我们带着这些疑问走进今天的文章,为您揭开Spring Native的面纱。 首先让我们看看什么是Spring Native? 中文: Spring Native可以使得Spring应用程序以GraalVM原生镜像的方式进行运行。 与Java虚拟机相比,native image可以为许多类型的工作负载提供更经济、更可持续的托管。这些包括微服务、非常适合容器的功能工作负载和Kubernetes。 使用native image这种方式具备一些关键优势,如即时启动、即时峰值性能和减少内存消耗。 Spring Native的诞生意味着Spring除了支持常规的Java虚拟机以外,还可以支持使用GraalVM原生镜像的方式进行...
相关文章
文章评论
共有0条评论来说两句吧...