1.1 什么是规则引擎
世界运作皆有规则。以生活中的规则为例:过马路,要遵守交通规则;工作中,要遵从公司制度;家庭中,要遵从道德规范……
不同的人可选择不同的做法——遵守或不遵守规则,对应的选择就是具体的“决策”。如果选择遵守规则,可能的结果是自己和他人的人身安全得到保障、升职加薪、获得道德荣誉;反之,可能就会面临安全风险、事业失败、受到道德谴责。
面对形形色色的规则,不同的人有不同的决策,而不同的决策必然会得到不同的结果,这一系列场景、规则、参与者的决策、结果等便构成了规则引擎的整个运作过程。
在领域模型中,常见的做法是基于面向对象的编程思想,将业务逻辑抽象为对象、对象的属性和对象的方法。这个做法有一个明显的特征,那就是规则与业务系统是完全耦合的,你中有我,我中有你。一旦涉及规则的修改,必然引起软件工程的全流程操作(代码编写、测试覆盖、上线发布等),最直观的影响就是投入成本增加、效率变低。为了解决这类问题,规则引擎产品及相应的技术框架应运而生。
在软件世界中,最多的便是“是与非”“0和1”的判断,每个业务分支该如何走,如何处理,会有怎样的结果,都是通过业务规则来判断、处理和展示的。
面对简单的或相对固定不变的判断,我们通常通过if…else…逻辑判断来处理。但如果某部分业务逻辑随时都可能变化,或者说在频繁地变化,依旧采用这种传统模式来处理,那么面临的将是频繁的代码改动与系统发布。
这对企业运营、开发团队,甚至客户都意味着成本和折磨。那么是否可以将变化的部分抽离,当需要改变规则时只需要简单地修改一些参数或少量修改代码,即可完成业务规则的变更呢?
当然可以,规则引擎便是为解决此痛点而生的,同时出现了不同的技术解决方案,其中一种解决方案便是本书的主角——Drools规则引擎。
Drools是最早由JBoss开发、目前由Red Hat开源的规则引擎,属于Red Hat的KIE Group组件之一,可以比较方便地与Red Hat的其他产品集成。比如,可以与jBPM工作流相结合实现对复杂规则流的管理。另外,它也可以与机器学习(Machine Leaning,ML)、深度学习(Deep Leaning,DL)等外部类库相整合,实现Pragmatic AI相关功能。
Drools基于Java语言编写,是市面上主流的开源规则引擎框架。Drools的推理策略算法(Phreak规则算法)在经典的Rete算法上进行升级和增强,算法成熟,可以高效匹配规则。Drools允许使用声明方式表达业务逻辑,可以使用非XML(可扩展标记语言)的本地语言编写规则,既便于学习和理解,也便于业务人员查看和管理规则。同时,它还可以直接将Java代码嵌入规则文件当中,给开发人员提供了极大的便利。
通过Drools规则引擎,可以将复杂多变的业务规则抽离到Drools支持的存储介质(数据库、文本文件、JAR包等)当中。需要改变业务逻辑时,只需修改存储介质中的逻辑判断,便可达到快速修改业务规则且避免频繁发布系统的效果。
Drools官方除提供了规则引擎的核心功能外,还提供了一系列基于该开源框架的组件(KIE Server、Business Central Workbench、Kogito等),便于使用者直接集成使用。同时它还支持多种形式的规则构建,可根据客户的具体需要灵活生成、管理规则。
在Drools 6.x、7.x版本中,Drools的规则管理系统(Business Central Workbench)提供了可视化的操作界面,运营人员可直接通过界面来修改规则、发布规则及完成其他操作,从而减少开发、运营成本,提升效率。在Drools 8.x中以Kogito替代了KIE Server和Business Central Workbench相关的功能。
虽然本书主要围绕Drools规则引擎来展开,但市面上大多数规则引擎的使用和实现原理都类似。建议读者在学习和使用时尽量将规则引擎的使用方法抽象成模型,融会贯通于各类规则引擎的使用中。关于此部分,在后面的章节中我也会帮助大家进行提炼和总结。