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 的函数的组合。你也可以说我们已经*编排(orchestrated)*了一个简单的管道,包括运行 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 及其函数组合特性可以轻松处理第一个用例,这是理所当然的。毕竟,计算 -> 保存 是一系列按顺序排列的功能 - 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 社区所有即将举办的活动。

查看全部