我们的日常生活是由规则驱动的,比如开车遇到红灯就停下来,是因为我们遵循一条红灯停的规则。我们可以用更加简单的结构来表示日常生活中的规则:当XXX的时候,做XXX的事情。
在软件应用系统中也是这样的,几乎所有复杂的业务场景都是由大量的简单规则组成的,而业务规则往往是不断变化的,如果使用常规代码则会产生大量的维护工作和版本优化。
规则引擎是由推理引擎发展而来的,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中剥离出来,并使用预定义的语义模块来编写业务决策。
规则引擎的主要功能就是接收数据的输入,解析业务规则并根据业务规则做出业务决策。
规则引擎的核心就是获取知识(Knowledge),并将Knowledge应用到特定数据上(Fact),它主要是使用产生式规则(Production Rules) IF "conditions" THEN "actions"来表达逻辑。
使用规则引擎的好处:
1、实现业务逻辑和业务规则的分离,实现业务规则的集中管理
2、可以动态修改业务规则,从而快速响应需求变更
3、使业务分析人员也可以参与编辑、维护系统的业务规则
Drools(Jboss Rules)是Java语言编写的开源规则引擎,使用Rete算法对所编写的规则求值,实现了将复杂多变的业务决策从应用程序中分离出来,以规则脚本的形式存放在文件中,使得规则的变更不再需要修改代码、重启机器就可以在线上环境立即生效。
Drools主要分为两部分:规则的编写和规则的解释执行。规则的编译与运行要通过Drools提供的API来实现,而这些API总体上又可以分为:规则编译、规则收集和规则执行。
使用Drools的优点:
1、简化系统架构,优化应用
2、提高系统的可维护性,降低维护成本
3、方便系统整合
4、减少编写“硬代码”业务规则的成本和风险
1、Working Memory
2、Fact
Fact对象是指在Drools规则应用中,将一个普通JavaBean对象插入到规则引擎的Working Memory当中后的对象。规则可以对Fact对象进行任意读写操作,Fact对象不是对原来JavaBean对象进行克隆,而是原来JavaBean对象的引用。
Fact对象通常是一个具有getter和setter方法的POJO对象,通过getter和setter方法可以很方便的对Fact对象进行读写操作,可以简单的将Fact对象理解为规则引擎与应用系统进行数据交互的桥梁。
3、Rule
一个规则Rule是由Conditions和Actions组成的,当所有的Conditions都匹配成功后,会执行Actions。Rule操作应用程序数据Fact来完成模式匹配过程。
一个Rule中的Conditions称之为LHS(Left Hand Side),Actions称之为RHS(Right Hand Side)。
4、KIE
KIE(Knowledge is everything)是Jboss里面一些项目的统称,比如我们比较熟悉的Drools和jBPM,这些项目之前有一定的关联关系,并且存在一些通用的API,比如涉及到构建(Build)、部署(Deploy)、加载(Load)等方面的,这些API都会以KIE为前缀来表示这些事通用API。后面会介绍到的KieServices、KieContainer、KieSession类都是KIE的公共API。
Drools规则引擎功能非常强大,但并不是所有场景都适用。一般来说,规则引擎适用项目都具有以下特征:
1、存在一个非常复杂的场景,即使商业专家也难以完全定义
2、没有已知或定义明确的算法解决方案
3、需求不稳定,经常变更
4、需要基础部分数据量快速做出决策