1

介绍

Drools Guvnor 拥有自己的版本控制系统,在生产使用中允许应用程序的用户修改规则和决策表,以适应他们业务的变化。然而,相同的资产继续存在于开发版本控制系统中,在该系统中开发了应用程序的新功能。

这篇文章是为了在使用 Drools 规则和 Guvnor 时寻找有关规则开发和部署的见解/想法/经验。

以下是我一直困惑的一些关键概念。

部署到 Guvnor

首先,将 drl 文件和决策表部署到生产环境的最佳方式是什么?只是简单地将它们放在一个 zip 包中,然后解压缩到 Web-Dav 文件夹?我在 Drools 中浏览的内容,我还没有找到一种方法来一次导入多个文件。不过,事实模型可以作为 jar 存档添加。Guvnor 似乎有某种 REST API,但使用它需要自定义部署脚本。

更换管理层

其次,一旦应用程序投入生产,用户可能希望更改决策表中的值,以便为高级客户等设置更高的折扣百分比。这一切都很好,很花哨,直到开始开发应用程序的 2.0 版本。

现在我们现在拥有的是

  • 版本控制系统中的 drl 文件和决策表
  • 用户修改的生产环境中的 drl 文件和决策表,由 Guvnor 版本化

现在我们正处于从 Guvnor 取回规则和决策表的阶段。Web-Dav 文件夹再次是最适合此的,还有哪些其他选项?

今天的合并工具甚至可以处理 Excel 文件差异,但在大型项目中对我来说听起来像是一个合并地狱。

保持事实模型向后兼容

另一个主题是事实模型完整性。对于假定的 2.0 版本,开发人员总是希望进行重构并将整个事实模型颠倒过来。尽管如此,它仍必须保持与以前版本的向后兼容,因为可能存在依赖于此的用户修改规则。对此有什么建议吗?只是保持事实模型简单干净?提前计划/建议用户想要改变什么?

概括

我确信我不是第一个,也肯定不是最后一个考虑使用 Drools 和 Guvnor 进行部署和变更管理的选项。所以,我想听到的是关于处理这些情况的一些最佳(也是最坏的)做法的评论、讨论、提示等。

谢谢。

4

1 回答 1

4

做事的最佳方式在很大程度上取决于您的特定应用程序和您工作的环境。但是,以下是我自己经验的建议。请注意,我现在只添加几点。当事情来找我时,我可能会回到这个答案。

在初始上线后,保持发布增量和小

对于您的第一个版本,您有机会尝试一下。利用这个机会,尽可能多地进行重构,因为...

您的应用程序已经上线,您的业务用户正在维护决策表中的规则。您在业内人士喜欢称之为“业务敏捷性”的方面取得了巨大的进步。不幸的是,这往往是以牺牲应用程序开发的敏捷性为代价的。您的所有指导编辑器规则和决策表规则都与您的事实模型相关联,因此对该事实模型的现有属性的任何更改都会破坏您的决策表。与现在的大多数 IDE 不同,您不能只右键单击一个事实的 getX() 方法,重命名它,然后期望所有依赖于该属性的代码都会被更新。

决策表和指导规则很难重构。如果一个事实已被重命名,那么在 Guvnor 的许多(所有?)版本中,该规则/表将不再打开。您需要通过 WebDav 获取底层 XML 文件并进行一些文本搜索和替换。这可能非常困难,考虑到要做到这一点,您需要将文件从生产环境下载到测试环境,进行更改,测试它们,将它们部署到测试环境。当您对更改感到满意时,您需要将它们推回“生产”Guvnor。不幸的是,当您这样做时,用户已经更新了许多决策表,您需要重新开始,或者重新应用过去几天的更改。在理想情况下,您的业务用户将同意在一段时间内不更改规则。

为了减轻这种情况:

  1. 将 Guvnor 中使用的事实与您的应用程序域类分开。然后,您的应用程序开发人员可以将内部应用程序模型重构为他们心中的内容,但此类更改不会影响业务模型。维护两者之间的映射并确保有涵盖这些映射的测试。
  2. 避免更改,例如重命名事实或其属性。确保您创建的事实及其属性具有适合领域的名称并与业务一致。另一方面,添加新属性相对容易。值得提醒用户关注他们未来的计划。
  3. 使事实尽可能简单。除非您确实需要,否则不要比名称-值对更复杂。一方面,您的业务用户会发现维护规则要容易得多。您在 Guvnor 中管理的任何内容的优先级始终应该是让业务用户易于维护。
  4. 将外部依赖项排除在您的事实之外。开发人员可能认为将事实注释为 JPA @Entity 是一个好主意,以便于持久化。不幸的是,这增加了需要添加到 Guvnor 的类路径中的依赖项,需要重新启动。

提示与技巧

我个人进行跨环境更改的技术是将 Eclipse 连接到两个 Guvnor WebDav 目录,并将规则签出到本地目录中,其中每个本地目录都映射到一个环境。然后我使用 Eclipse 差异工具。

在构建 Guvnor 管理的知识库时,我创建了一个单独的 Maven 项目,其中仅包含事实,并且不依赖于其他任何内容。这样更容易保持它们的清洁。此外,当我确实需要添加依赖项时(即,我尽可能使用 JodaTime),然后构建可以有一个步骤来生成包含所有依赖项的阴影 JAR。这样,您只需将一个 JAR 部署到 Guvnor,保证包含正确版本的依赖项。

我相信我会想到更多。我会尽量记住回到这个...

于 2013-11-15T12:55:48.990 回答