Spring Cloud Stream - 去神秘化与简化

工程 | Oleg Zhurakousky | 2019年10月14日 | ...

这是系列博客文章中的第一篇,旨在澄清并预览 spring-cloud-streamspring-cloud-function 即将发布的版本(均为 3.0.0)中的内容。

最近,我与一位用户进行了一次讨论,听到了一些事情,促使我开始一系列博客文章(从这篇开始),旨在揭开 Spring Cloud StreamSpring Cloud Function 项目的真正目标,并展示它们的新特性。

Spring Integration 包装器?

促成这一切的具体说法是——“Spring Cloud Stream,作为一个轻量级的 Spring Integration 输入/输出路由器……”。这是一个有趣的看法,但我不得不提出异议。虽然它可能受到了企业集成模式(EIP)的启发,并建立在 Spring Integration(SI)之上,但后半部分真的只是一个实现细节。Spring Cloud Stream(SCSt)作为一个框架,从来都不是为了“成为一个轻量级的 Spring Integration 输入/输出路由器”。事实上,这个说法揭示了部分问题,即 SI(为了支持 SCSt 的一些内部需求而选择的框架)不知何故被认为是 SCSt 的核心,以至于许多人认为 SCSt 是 SI 的一个扩展或包装器。它不是。它一直以来都是关于纯粹的微服务,并将它们绑定到数据目标(即消息系统)。就这么简单。如果你从足够远的距离抽象自己,不去了解 SCSt 的内部实现,你会很快意识到它实际上是一个绑定和激活框架。它将一段代码(由用户提供)绑定到由绑定器暴露的数据源/目标,并根据绑定器实现(例如,消息到达等)激活该代码。基本上就是这样。

是函数,还是不函数?

从历史上看,Spring Cloud Stream 暴露了一个基于注解的配置模型,要求用户提供大量本可以轻松推断的信息,从而简化配置。

让我们看以下两个代码片段

基于注解

@SpringBootApplication
@EnableBinding(Processor.class)
public class SampleApplication  {
    @StreamListener(Processor.INPUT)
    @SendTo(Processor.OUTPUT)
    public String uppercase(String value) {
        return value.toUpperCase();
    }
}

基于函数(自 v2.1.0 起)

@SpringBootApplication
public class SampleApplication  {
    @Bean
    public Function<String, String> uppercase() {
        return value -> value.toUpperCase();
    }
}

两者都是有效且功能齐全的 SCSt 应用程序。两者都做同样的事情并产生相同的结果——不同之处在于,在基于注解的示例中,用户必须了解 SCSt 抽象(即消息传递、通道、绑定等),而实际用户代码与它们中的任何一个都无关。这引发了一个问题:为什么?Spring 一直以来都是关于“你担心功能需求,我们负责非功能性(样板代码)”。因此,在 SCSt 作为一个框架及其“绑定和激活/触发”的核心目标的背景下,我们很快意识到这些抽象是样板代码,不应泄露到用户代码中,尤其是以注解的形式,因为它们无故导致了此类代码对 SCSt 的二进制依赖。此外,鉴于 Spring 组合中大多数新框架的基础是 Spring Boot,请思考 Spring Boot 的核心信息——依赖项(例如 JAR)包含自动配置,这实际上是关于我们(Spring)认为事物应该如何运作的观点,同时为你提供选择退出的方式。因此,在这种情况下,为什么你需要提供如此多的指令,特别是通过注解(EnableBinding、Processor、StreamListener 等),而人们只需遵循一些约定就可以轻松提取或推断出相同的信息(在 SCSt 的上下文中)。例如,SCSt 上下文中的函数 bean 是一个处理器。我们知道处理器只有一个输入目标和一个输出,并且我们知道它们的名称,那么为什么我们需要明确说明已知和显而易见的东西呢?等等……此外,请记住,在推导出所有这些的同时,我们仍然保留了现有消费者和生产者属性以及所有其他配置选项的使用。它们仍然适用于此处,让你能够像使用 StreamListener 一样配置和重新配置相同的事物。

因此,我也想说,我们正在开始缓慢地从基于注解的编程模型转向更敏捷、更简单、更符合 Spring Boot 的、具有明确文档和直观约定的、且用户只需少量开箱即用配置的“有主见”模型。

有关 spring-cloud-stream 中功能支持的最新信息,请关注此链接

欢迎提供任何反馈。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有