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

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

我们很高兴地宣布发布 Spring Cloud Stream 应用程序 2020.0.0-M2。此版本是对旧版 Spring Cloud Stream App Starters 的全面改革。从该版本开始,我们将放弃以主题命名的发布列车名称(按字母顺序排列的著名科学家),转而采用基于日历的版本控制。当前的 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 App Starters。一个自定义 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 仓库是一个 monorepo。与每个应用程序都有自己仓库的 stream-cloud-app-starters 不同,新的 stream-applications 仓库在一个仓库中包含所有内容(函数、应用程序和通用组件)。这简化了依赖管理并允许原子提交。希望这一改变以及其他正在进行的努力将使开发人员更容易,并有助于鼓励社区贡献。

此版本包含什么?

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

  • 供应商和源:File、FTP、SFTP、AWS S3、HTTP、Geode、TCP、Time、Twitter、Websocket、JDBC、JMS、RabbitMQ、MQTT。

  • 消费者和接收器:Analytics、Cassandra、File、FTP、Geode、JDBC、Log、Mongodb、MQTT、Rabbit、Redis、AWS S3、SFTP、TCP、Twitter、Wavefront、Websocket。

  • 函数和处理器:Filter、Header Enricher、HTTP Request、Tensorflow(图像识别、对象检测和语义分割)、SpEL、Splitter、Task Launch Request、Task Launcher、Twitter。

有关完整列表,请参阅 Stream Applications README

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

在许多情况下,新应用程序提供了与以前版本相同的功能。在某些情况下(例如 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 社区所有即将举行的活动。

查看所有