领先一步
VMware 提供培训和认证,助你快速进步。
了解更多这是系列博客文章的第一篇,旨在阐明和预览即将发布的 spring-cloud-stream 和 spring-cloud-function (都是 3.0.0) 版本中的新内容。
最近,我与一位用户进行了讨论,听到了一些话促使我开始撰写一系列博客文章(从这篇开始),目的是揭示 Spring Cloud Stream 和 Spring Cloud Function 项目的真正目标,并展示它们的新特性。
引发这一切的具体说法是——“Spring Cloud Stream,是一个轻量级的 Spring Integration 输入/输出路由器……”。这是一个有趣的看法,但我不得不表示异议。虽然它可能受到了企业集成模式 (EIP) 的启发,并且构建在 Spring Integration (SI) 之上,但后一部分实际上只是实现细节。Spring Cloud Stream (SCSt) 作为一个框架,从来就不是关于“作为一个轻量级的 Spring Integration 输入/输出路由器”。事实上,这个说法揭示了问题的一部分,即 SI(作为支持 SCSt 一些内部需求的框架选择) somehow 被认为是 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 对齐的、有明确立场(opinionated)的模型,该模型具有清晰文档记录且直观的约定,并且对用户所需的开箱即用配置有限。
有关 spring-cloud-stream 中函数支持的最新信息,请参阅此链接。
欢迎随时提供反馈。