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 社区中所有即将举行的活动。

查看全部