Spring Cloud Stream - 组合函数或 EIP

工程 | Oleg Zhurakousky | 2019 年 11 月 04 日 | ...

为了准备即将发布的 Spring Cloud Stream (SCSt) 3.0.0 - Horsham 和 Spring Cloud Function (SCF) 3.0.0,我们发布了一系列文章,讨论并展示了新功能和增强功能。我们提供了从基于注解的编程模型转向函数模型的动机和理由,然后我们详细介绍了函数式方法以及反应式函数。在另一篇文章中,这与我们接下来要讨论的内容相关,Artem 展示了将函数式方法与 Spring Integration 项目结合起来的好处。我们还在上一篇文章中讨论了事件路由

在这篇文章中,我们将讨论函数组合和企业集成模式 (EIP),它们的共性、差异以及在 SCSt 环境下它们如何相互补充。

“没有复杂的问题,因为每个复杂的问题都不过是一系列简单问题的集合。”

函数组合

函数组合是 SCF 的一项功能,它允许您以声明方式将多个函数组合在一起。以下示例展示了如何实现:

--spring.cloud.function.definition=uppercase|reverse

在这里,我们实际上提供了一个单一函数的定义,该函数本身是由一个名为 uppercase 的函数和一个名为 reverse 的函数组合而成的。您也可以说我们已经编排了一个简单的管道,该管道包括运行 uppercase 函数,然后将其输出发送到 reverse 函数。这里的术语编排很重要,我们稍后将在文章中更详细地介绍它。

企业集成模式 (EIP)

企业集成模式是一组模式,它们允许您将业务案例描述为一组清晰定义且易于理解的模式。一些示例包括过滤器转换器路由器等。有关 EIP 的更多详细信息,请参阅此链接。Spring 通过 Spring Integration 框架提供了 EIP 的参考实现。例如,通过使用与之前相同的两个函数示例,我们可以构建一个使用 SI 的 Java DSL 的管道,如下所示:

IntegrationFlow.fromChannel(inputChannel)
        .transform(uppercase)
        .transform(reverse);

有关 SI 的 Java DSL 的更多信息,请参阅 Java DSL 文档以及此快速教程

这里的核心观点是,我们刚刚展示了两种通过编排管道来解决相同问题的方法。两者都可以看作是复杂功能的编排器。

  • 通过组合进行编排:您得到一个单一函数。
  • 通过委托进行编排:您得到某种流程。

为什么这很重要?如前所述,没有复杂的问题,因为每个复杂的问题都不过是一系列简单问题的集合。所以复杂性就是一种组合。然而,即使是复杂性也可以被看作是直接的或复杂的。让我们看几个用例来设定上下文。

  • a) 考虑一个你需要计算一些东西…并将其保存到数据库的场景。
  • b) 考虑另一个场景,你需要计算一些东西,但是,如果某些属性缺失或未就绪,你需要将其发送回去以获取更多信息,然后再次计算(如果提供了足够的信息),然后将其保存到数据库。

本着将复杂性分解为简单性的精神,第一种情况可以分解为按顺序排列的两个服务:计算 -> 保存(类似于我们之前的大写 -> 反转示例)。第二种情况虽然相似,但包含一个决策点,该决策点可以触发一个包含某种附加服务调用(等等)的循环。换句话说,它不像简单的计算 -> 保存那么直接。

Spring Integration 或 Spring Cloud Function 组合?

首先,让我们快速说明 EIP 及其实现 Spring Integration 可以轻松处理这两种用例。它们提供:

  • 将一个进程的结果按顺序传递给另一个进程的模式
  • 回溯的能力
  • 根据某些条件进行路由或过滤
  • 更多选项

另一方面,SCF 凭借其函数组合功能,可以轻松处理第一个用例,这是理所当然的。毕竟,compute -> save 是一系列按顺序排列的功能集合 - computeFunction.andThen(saveFunction).andThen(..) 或使用 SCF 符号 computeFunction | saveFunction。此外,鉴于 SCF 和 SI 内部实现上的差异,SCF 组合要简单得多且性能更高。然而,第二个用例(其步骤并非完全按顺序排列)如果不是不可能的话,也很难通过函数组合来实现。在这种情况下,使用 SI 这样的框架将是首选。

好消息是,当分解后,复杂性仍然可以被实现为 SCF 和 SI 认可的一等公民函数,正如 Artem Bilan 在这篇文章中所述。这意味着您可以推迟决定编排方法,稍后选择 SI 或 SCF,或者两者的组合。

总结

SCF 组合更适合编排按顺序排列的功能,而 SI 是更适合其他所有符合 EIP 类别情况的选择。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看所有