使用 Apache Camel 实施技术决策
在许多企业集成模式中,必须根据消息的内容(消息路由器、基于内容的路由器、消息过滤器、动态路由器、收件人列表、控制总线)做出决策。这些通常是纯粹的技术决策,例如确定某些极限值。由于外部条件(例如公司战略的变化、新法律),这些决策常常需要调整和重新实施。
在 Apache Camel 中,有不同的方法来实现和连接决策规则。
Apache Camel 中专家决策的不同集成策略:
一切都在代码中
在 Apache Camel 中表示此类决策的最简单方法是直接实现它们。根据消息结构的复杂性,这可以使用 Apache Camel 支持的语言(例如简单表达式语言或 XPath)来实现,也可以外包到 Java 代码中的 Java Bean 中。直接存储在源代码中的逻辑对于开发人员来说非常容易实现。然而,对于专家来说,这是很难理解的。此外,决策逻辑与集成的技术结构紧密交织,因此对该逻辑的任何(技术)更改都需要部署整个系统。
public void decide(Customer c) {
if (c.getAge < 15) {
c.setAccount("infant");
} else if (c.getAge < 21) {
c.setAccount("youth");
} ...
}
图 1:源代码中的规则示例
使用案例:
决策规则在软件的生命周期中几乎不会改变,并且规则由开发人员专门维护和管理。
使用规则引擎(Drools)
Drools 可用于使专家可以理解决策,甚至可以让专家用户直 购买比特币电子邮件列表 接管理决策规则。 Drools 提供了不同的方式来定义规则,从规则语言到决策表。还有一些工具可以在 DMN 中定义规则并在 Drools 中运行它们。
图 2:决策表示例
图 2:决策表示例
Drools 可以轻松集成到 Apache Camel 中。为此,首先定义一个 Drools KIE 会话。会话获取名称和类型,规则定义的存储位置由 kie:kbase 中的 packages 属性指定。
<kie:kmodule id="camel-context">
<kie:kbase name="rules" packages="ch.adesso.crm.rules">
<kie:ksession name="ksession-1" type="stateless"/>
</kie:kbase>
</kie:kmodule>
图 3:定义 Drool 的 KIE 会话
定义会话后,就可以使用 KIE 组件在 Apache Camel 中使用它。针对交换正文中的对象评估会话规则。
<to uri="kie:ksession-1?action=insertBody" />
图 4:在 Apache Camel 中使用 KIE 会话
这种方法的优点是现在可以用专业用户更容易理解的符号来定义规则。但是,如果规则发生更改,仍然需要在 Apache Camel 中进行部署才能使新规则定义适用。
使用案例:
决策规则在软件的生命周期中很少发生变化,并且业务用户参与维护规则。
将规则外包给决策服务器
为了将 Apache Camel 中的路由部署(集成逻辑)与决策的技术规则分开,可以为 Drools 使用独立于 Apache Camel 的决策服务器。规则直接在此服务器中定义,并且可以通过 REST API 集成。这意味着它们可以在决策服务器中根据需要进行更改 - Apache Camel Route 始终使用最新版本的规则,而无需部署集成逻辑。如果规则在决策服务器中集中管理,那么还有一个优点是它们可以被其他应用程序使用,并且不必为每个应用程序复制甚至重新实现。这避免了冗余并保证了系统的一致性。
为了在决策服务器中实现规则,必须使用 Maven 将域模型导入到服务器中。然后根据域类定义规则。 Decision Server 提供了一个 Web GUI,还允许专家用户轻松维护规则库。
为了最终能够应用 Apache Camel 的规则,要分析的对象必须序列化存储在交换主体中,以便可以通过简单的 REST POST 调用执行相应的规则。然后,规则评估的结果存储回交换主体中,并且可能需要再次反序列化。
图 5:来自 Apache Camel 的 REST 调用
<batch-execution lookup="defaultStatelessKieSession">
<insert out-identifier="customer" return-object="true" entry-point="DEFAULT">
<ch.adesso.crm.persistence.entities.Customer>
<name>Daniel</name>
<age>24</age>
</ch.adesso.crm.persistence.entities.Customer>
</insert>
<fire-all-rules />
</batch-execution>
图 6:REST 请求正文示例
然而,当使用决策服务器时,必须考虑到额外的服务器会增加系统的复杂性。还必须考虑到与决策服务器的通信涉及一定的开销,如果存在大量调用,这可能会影响性能。
使用案例:
规则经常变化,业务用户在开发和维护规则库方面发挥着重要作用。
结论
关于如何将业务规则集成到 Apache Camel 中,有不同的方法。然而,没有适合每种情况的完美解决方案,您必须根据应用程序决定最有意义的解决方案。
迪特尔·韦恩加德的图片
作者 迪特尔·韦恩加兹
Dieter Wijngaards 担任 adesso Schweiz AG 的首席技术官,负责复杂客户项目中企业架构的构思和实施。在过去的几年中,他和他的团队积累了广泛的 Apache Camel 和 JBoss Fuse 专业知识,并成功为客户实施。
类别: 软件开发
标签: 敏捷 软件项目 信息技术项目
阿斯达夫
我们的博客文章一览
在我们的技术博客中,我们将带您踏上令人兴奋的 adesso 世界之旅。您可以在我们之前的博客文章中找到其他有趣的主题。
至所有博客文章
阿斯达夫
我们的 adesso 博客时事通讯
您想定期收到我们的 adesso 博客更新吗?然后只需订阅我们的时事通讯,您将通过电子邮件方便地收到我们技术博客的最新文章。