领先一步
VMware 提供培训和认证,助你加速进步。
了解更多在 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 的更多详细信息,请参阅此链接。Spring 通过 Spring Integration 框架提供了 EIP 的参考实现。例如,使用与之前相同的两个函数示例,我们可以使用 SI 的 Java DSL 构建一个管道,如下所示
IntegrationFlow.fromChannel(inputChannel)
.transform(uppercase)
.transform(reverse);
有关 SI 的 Java DSL 的更多信息,请参阅Java DSL 文档以及此快速教程。
这里的核心要点是,我们刚刚展示了通过编排管道来解决同一问题的两种方法。两者都可以看作是复杂功能的编排者
为什么这很重要?正如之前所述,*没有复杂的难题,因为每个复杂的难题都不过是由一系列简单的难题组成*。所以复杂性是一种组合。然而,即使是复杂性也可以被视为直截了当或复杂的事物。让我们看几个用例来设置上下文
本着将复杂性分解为简单性的精神,第一种情况可以分解为两个顺序的服务:*计算 -> 保存*(类似于我们之前的*转大写 -> 反转*示例)。第二种情况,虽然类似,但包含一个决策点,该决策点可以触发一个循环回,其中包含某种类型的附加服务调用(等等)。换句话说,它不像简单的*计算 -> 保存*那样直截了当。
首先,让我们快速说明 EIP 及其实现 Spring Integration 可以轻松处理这两种用例。它们提供了
另一方面,SCF 及其函数组合特性可以轻松处理第一个用例,这是理所当然的。毕竟,计算 -> 保存
是一系列按顺序排列的功能 - computeFunction.andThen(saveFunction).andThen(..)
或使用 SCF 的表示法 computeFunction | saveFunction
。此外,由于 SCF 和 SI 内部实现上的差异,使用 SCF 组合要简单得多,性能也更高。然而,第二个用例(它并非完全按照一系列步骤对齐)使用函数组合将很难甚至不可能实现。在这种情况下,使用 SI 这样的框架将是首选。
好消息是,分解后,复杂性仍然可以被视为 SCF 和 SI 识别为一等公民的函数,正如 Artem Bilan 在这篇文章中所述。这意味着你可以推迟决定你的编排方法,直到稍后选择 SI、SCF 或两者的组合。
SCF 组合更适合编排按顺序排列的功能,而 SI 是适合 EIP 类别中其他所有内容的更好选择。