领先一步
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
的函数的组合。你也可以认为我们已经编排了一个简单的管道,它包括运行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类别的所有其他内容。