Spring Cloud Stream 应用的 Java 函数介绍 - 第 0 部分

发布 | David Turanski | 2020年7月13日 | ...

我们很高兴地宣布发布 Spring Cloud Stream 应用 2020.0.0-M2。此版本是对旧版 Spring Cloud Stream 应用启动器 的彻底改版。从这个版本开始,我们将从主题导向的发行列车名称(按字母顺序排列的著名科学家)转向基于日历的版本控制。当前的 GA 版本称为 *Einstein*,我们很高兴推出 *2020.0.0-M2*。我们也正在弃用应用启动器。在重新组织、重新打包以及(在某些情况下)重写底层代码之后,我们现在拥有一个新的 Git 仓库:spring-cloud/stream-applications: 用于数据驱动微服务的函数和 Spring Cloud Stream 应用

我们是怎么走到这一步的?

自 2016 年 Spring Cloud Data Flow 推出以来,Spring 团队一直维护着基于 Spring Cloud Stream 的预打包应用程序。这些是可用于生产环境的应用程序,它们基于 Spring 和 Spring Integration 的成熟功能构建,可提供与常用开源数据存储、消息代理、在线服务和通信协议的开箱即用集成。事实上,十多年来,我们一直在为企业开发人员构建业务关键型系统提供底层组件。下面的时间线总结了从 Spring Integration 组件到预打包应用程序的演变。

Stream Applications Timeline

使用 Data Flow 编排数据流管道或直接将这些应用程序用作数据微服务时,这些应用程序可以帮助您快速启动。与 Spring 的理念一贯保持一致,我们为您完成了繁重的工作,让您专注于业务逻辑。

Spring Cloud Stream 应用程序的核心是一个 Spring Boot 应用程序(uber jar),其中包含 Spring Cloud Stream 绑定器依赖项。绑定器公开了一个服务提供程序接口,用于抽象化利用底层消息传递中间件(例如 Apache Kafka、RabbitMQ、Amazon Kinesis、Google Pub Sub 和 Solace)进行分布式通信的实现,从而隐藏了中间件的具体细节。因此,应用程序不知道它用于通信的底层中间件。

此架构使我们能够在没有绑定器的情况下实现核心功能,如同 Spring Cloud Stream 应用启动器 一样。自定义 Maven 插件用于生成 Maven pom 文件(每个 Apache Kafka 绑定器和 RabbitMQ 绑定器一个)以及导入应用程序启动器配置的通用 Spring Boot 主类。pom 还包括 监控 和安全支持。预打包的流应用程序可与 Apache Kafka 或 RabbitMQ 一起使用,并作为 Spring Boot 可执行 jar 文件和 Docker 镜像发布到公共存储库。

在许多方面,预打包的流应用程序可以与 Kafka Connect 相比。虽然这不是一个完全相同的比较,但流应用程序可以替代 Kafka Connect 应用程序。Kafka Connect 应用程序需要 Apache Kafka 来生成和使用数据,而 Spring Cloud Stream 应用程序可与各种中间件技术一起使用,包括前面提到的 Kafka。请注意,我们所有的预打包应用程序都是免费且开源的,而许多 Kafka 连接器则需要商业许可。

发生了哪些变化?

Java 函数

Java 和 Spring 生态系统的持续进步促使我们重新思考我们的方法。最显著的变化是,我们实现了一个分层架构,其中以前由应用程序启动器提供的核心功能现在作为 Java 函数提供,实现的是在 *java.util.function* 包中找到的标准接口。

此版本中的功能组件可以作为标准 Spring bean 公开,然后通过直接将它们嵌入应用程序中来满足您的数据集成需求。通过在自定义应用程序中注入这些函数,您可以立即受益于底层库提供的功能。例如,许多这些函数都使用 Spring Integration 适配器。您可以直接调用函数,使用 Spring Cloud Function 通过 REST 端点调用它,或在无服务器环境中使用它。与应用程序启动器不同,功能组件不依赖于 Spring Cloud Stream。但是,它们现在是流应用程序的核心组件。下图显示了组件和应用程序之间的关系。

Stream Applications Layered Architecture

流应用程序

通过使用 Spring Cloud Stream,我们可以利用 java.util.function 类型的逻辑等效性(Supplier、Function、Consumer)与 Spring Cloud Stream 概念(分别为 source、processor 和 sink)。与以前一样,我们使用改进的 Maven 插件 来生成 Spring Boot 主类、application.properties 文件以及具有内置 监控 和安全支持的特定于绑定器的 Maven pom 文件。除少数例外情况外,我们可以构建 Spring Cloud Stream 应用程序而无需任何其他代码。

新方法具有多项优势:

  • Spring Cloud Stream v3.x 引入了一个强大的 函数式编程模型,该模型基于 Spring Cloud Function。这种方法优于旧的基于注解的模型(@EnableBinding@StreamListener)。Spring Cloud Stream 可以直接绑定到 Function @Bean 的输入和输出。使用此模型,不需要旧的 Spring Cloud Stream 注解或 Source、Processor 和 Sink 接口。

下图通过使用打包为 Spring Cloud Stream 应用程序的简单函数来说明此概念。绑定器实现和外部配置属性使应用程序能够通过消息代理进行通信,但应用程序代码与这些都不相关。每当消息到达 *time* 主题时,Spring Cloud Stream 就会在 ProcessorApplication 中调用 *helloTime* 函数,并将输出定向到 *hello* 主题。同样,SinkApplication 中的 *printTime* Consumer 会被到达 *hello* 主题的消息触发。但是是什么触发了 SourceApplication?正如您可能猜到的那样,Spring Cloud Stream 会自动配置一个轮询器,默认情况下每秒调用一次 *currentTime* Supplier。当然,这是可配置的。

Spring Cloud Stream Example

  • 功能组件可用于打包和部署在 Spring Cloud Stream 以外的各种用途,尤其是在 FaaS 环境中。

  • 在适当的情况下,功能组件使用 Project Reactor 构建,以实现非阻塞式反应式流。

  • 流应用程序(或使用功能组件构建的任何 Spring Boot 应用程序)可以利用 Spring Cloud Function 的声明式函数组合功能。这意味着预打包的流应用程序无需任何定制即可配置为执行常见的转换和过滤操作。

  • 新的 stream-applications Git 仓库是一个 单体仓库。与每个应用程序都有其自身存储库的 *stream-cloud-app-starters* 不同,新的 *stream-applications* 存储库在一个存储库中包含所有内容(函数、应用程序和公共组件)。这简化了依赖项管理并允许原子提交。希望这种变化以及其他正在进行的工作能够使开发人员的工作更容易,并有助于鼓励社区贡献。

此版本包含什么内容?

以下是此版本中提供的各种函数和应用程序的部分列表:

  • 提供程序和源:文件、FTP、SFTP、AWS S3、HTTP、Geode、TCP、时间、Twitter、WebSocket、JDBC、JMS、RabbitMQ、MQTT。

  • 使用者和接收器:分析、Cassandra、文件、FTP、Geode、JDBC、日志、MongoDB、MQTT、Rabbit、Redis、AWS S3、SFTP、TCP、Twitter、Wavefront、WebSocket。

  • 函数和处理器:过滤器、报头增强器、HTTP 请求、TensorFlow(图像识别、对象检测和语义分割)、SpEL、拆分器、任务启动请求、任务启动器、Twitter。

请参阅 Stream Applications 自述文件,了解完整的列表。

这对当前用户意味着什么?

在许多情况下,新应用程序提供了与先前版本等效的功能。在某些情况下(例如 Twitter),我们显著增强了功能。我们还合并并重命名了一些应用程序。简而言之,存在一些重大更改。值得注意的是,许多配置属性名称已更改(在适当的情况下),以反映与功能组件的关联(例如,s3.supplier.remoteDir)。此外,这些应用程序可能无法与使用旧版 Spring Cloud Stream 构建的流应用程序一起使用。例如,使用旧版 Spring Cloud Stream 构建的源不能保证与来自此版本的接收器一起使用。如果您已经在使用先前版本预打包的应用程序,则无需立即升级,除非您必须利用一些新功能。Einstein 版本列车将进入维护模式,因此未来只会包含错误修复。所有新开发都将应用于未来的版本。

如何贡献新的函数或应用程序?

如果您在现有的函数和应用程序目录中找不到您要查找的内容,请考虑贡献。这样,整个开源社区都将受益。在后续文章中,我们将逐步讲解开发函数和流应用程序的实际示例。

我们鼓励社区参与到这个项目中。我们有一些公开的问题标注为非常适合贡献。除了代码贡献外,我们也非常感谢文档改进、创建问题和收藏仓库。

敬请期待……

这篇博客是每周系列文章中的第一篇,将更详细地介绍此处介绍的主题。在接下来的几周中,期待更多深入探讨和重点主题。我们将带您了解此存储库中包含的所有组件以及相关的流程。

Spring Cloud Stream 应用程序的 Java 函数介绍 - 第 1 部分

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

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

查看全部