1、什么是规则引擎
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。

因为规则引擎将复杂的业务逻辑从业务代码中剥离出来,所以可以显著降低业务逻辑实现难度;同时,剥离的业务规则使用规则引擎实现,这样可以使多变的业务规则变得可维护,配合规则引擎提供的良好的业务规则设计器,不用编码就可以快速实现复杂的业务规则,同样,即使是完全不懂编程的业务人员,也可以轻松上手使用规则引擎来定义复杂的业务规则。

业务系统运行过程中难免会发生业务规则变化的情形,有了规则引擎,业务规则部分采用的是规则引擎实现,这样在系统正常运行的情况就可以利用规则引擎对业务规则进行修改,从而实现业务规则的随需应变。

常见的规则引擎高级视图如下:

2、为什么要使用规则引擎
规则一般使用如下一阶逻辑对知识表示进行推理:

when
          <conditions>
then
        <actions>
规则引擎一般具备以下好处:

声明式编程

规则引擎允许您说“该怎么做”,而不是“怎么做”。

使用规则可以使表达困难问题的解决方案变得容易,因此可以验证这些解决方案。规则比代码容易阅读。

规则系统能够解决非常非常棘手的问题,并解释了解决方案的产生方式以及沿途做出每个“决定”的原因。

逻辑与数据分离

数据在域对象中,逻辑在规则中。这从根本上打破了数据和逻辑的耦合,这可能是优点还是缺点。但是解耦逻辑可以更容易维护。可以将逻辑全部组织在一个或多个非常不同的规则文件中,而不是将逻辑分布在许多域对象或控制器中。

速度和可扩展性

Rete算法,Leaps算法及其后代(如Drools的ReteOO)提供了非常有效的方式来将规则模式与域对象数据进行匹配。当数据集变化很小时,这些规则特别有效,因为规则引擎可以记住过去的匹配项。具备良好的实战证明。

知识集中

通过使用规则,您可以创建可执行的知识库(知识库)。这意味着,规则具有很高的可读性,因此它们也可以用作文档。

工具整合

诸如Eclipse之类的工具(以及基于Web的用户界面)提供了编辑和管理规则以及获得即时反馈,验证和内容帮助的方法。还提供审计和调试工具。

说明设施

规则系统能够记录规则引擎做出的决定以及做出决定的原因,从而有效地提供了“解释工具”。

可理解的规则

通过创建对象模型以及(可选)为问题域建模的领域特定语言,您可以设置自己编写与自然语言非常接近的规则。以自己的语言表达自己的逻辑,可以让非技术领域的专家容易理解,并且所有程序都经过检查,而技术知识则隐藏在常规代码中。

规则引擎主要完成的就是将业务规则从代码中分离出来。

在规则引擎中,利用规则语言将规则定义为 if-then 的形式,if 中定义了规则的条件,then 中定义了规则的结果。规则引擎会基于数据对这些规则进行计算,找出匹配的规则。这样,当规则需要修改时,无需进行代码级的修改,只需要修改对应的规则,可以有效减少代码的开发量和维护量。

3、有哪些常用的规则引擎
Java 开源的规则引擎有:Drools、Easy Rules、Mandarax、IBM ILOG。使用最为广泛并且开源的是 Drools。

通过类型对规则引擎进行简单分类,一般有以下3类:

通过界面配置的成熟规则引擎:这种规则引擎相对来说就比较重,但是因为功能全,也有部分业务会选择这个,一般出名的有:Drools、IBM ILOG、URule

基于JVM脚本语言:这种其实不是一个成熟的规则引擎,应该算是规则引擎中的核心技术,因为Drools这种相对太重了,很多互联网公司会基于一些jvm的脚本语言,开发一个轻量级的规则引擎,这里比较出名的有:Groovy、AviatorScript、qlexpress。

基于java代码的规则引擎:上面是基于jvm脚本语言去做的,会有一些语法学习的成本,所以就有基于java代码去做的规则引擎,比如通过一些注解实现抽象的方式去做到规则的扩展,比较出名的有: EasyRules

下面针对其中几个开源免费的规则引擎进行简单介绍:

3.1 、JBOSS Drools
官网:http://www.drools.org/

官方文档:http://www.drools.org/learn/documentation.html

Drools 是一个基于 Charles Forgy’s 的 RETE 算法的,易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师人员或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。

Drools 是用 Java 语言编写的开放源码规则引擎,使用 Rete 算法对所编写的规则求值。Drools 允许使用声明方式表达业务逻辑。可以使用非 XML 的本地语言编写规则,从而便于学习和理解。并且,还可以将 Java 代码直接嵌入到规则文件中,这令 Drools 的学习更加吸引人。

相关概念
事实(Fact): 对象之间及对象属性之间的关系

规则(rule): 是由条件和结论构成的推理语句,一般表示为 if…Then。一个规则的 if 部分称为 LHS,then 部分称为 RHS。

模式(module): 就是指 IF 语句的条件。这里 IF 条件可能是有几个更小的条件组成的大条件。模式就是指的不能在继续分割下去的最小的原子条件。

Drools 通过事实、规则和模式相互组合来完成工作,drools 在开源规则引擎中使用率最广,但是在国内企业使用偏少,保险、支付行业使用稍多。