开源规则引擎
开源的规则引擎整体分为下面几类:
-
通过界面配置的成熟规则引擎,这种规则引擎相对来说就比较重,但功能全,比较出名的有:drools, urule。
-
基于jvm脚本语言,互联网公司会觉得drools太重了,然后会基于一些jvm的脚本语言自己开发一个轻量级的规则引擎,比较出名的有,groovy(开源风控radar),aviator,qlexpress。
-
基于java代码的规则引擎:基于jvm脚本语言会有一些语法学习的成本,所以就有基于java代码去做的规则引擎,比如通过一些注解实现抽象的方式去做到规则的扩展,比较出名的有: easy rules。
这边重点介绍三款产品drools、qlexpress和groovy,先介绍下基础能力和优劣势,后面再进行详解。
Drools
drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效。
drools官网地址:https://drools.org/
drools源码下载地址:https://github.com/kiegroup/drools
在项目中使用drools时,即可以单独使用也可以整合spring使用。如果单独使用只需要导入如下maven坐标即可:
<dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>7.6.0.Final</version>
</dependency>
如果我们使用IDEA开发drools应用,IDEA中已经集成了drools插件。如果使用eclipse开发drools应用还需要单独安装drools插件。
drools API开发步骤如下:
Groovy
Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。
Groovy是从Java衍生出来的,并且运行在Java虚拟机上的语言.其目标是不管作为脚本语言,还是编程语言,都可以简单、直接使用。Groovy 也并不会替代 Java,而是相辅相成、互补的关系,具体使用哪门语言这取决于要解决的问题和使用的场景。
QLExpression
由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。
在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神,于2012年开源。
QLExpress脚本引擎被广泛应用在阿里的电商业务场景,具有以下的一些特性:
1、线程安全,引擎运算过程中的产生的临时变量都是threadlocal类型。
2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当。
3、弱类型脚本语言,和groovy,javascript语法类似,虽然比强类型脚本语言要慢一些,但是使业务的灵活度大大增强。
4、安全控制,可以通过设置相关运行参数,预防死循环、高危系统api调用等情况。
5、代码精简,依赖最小,250k的jar包适合所有java的运行环境,在android系统的低端pos机也得到广泛运用。
规则引擎对比
常见能力对比如下:
规则引擎 | QLExpression (ms) | groovy(ms) | drools(ms) |
---|---|---|---|
动态规则 | 支持 | 支持 | 支持 |
灵活性 | 低 | 高 | 中 |
复杂度 | 低 | 高 | 中 |
上手 | 快 | 慢 | 慢 |
使用广度 | 中 | 中 | 高 |
执行性能对比如下:
执行次数\规则引擎 | QLExpression (ms) | groovy(ms) | drools(ms) |
---|---|---|---|
100w | 1590 | 171 | 364 |
1000w | 12551 | 709 | 3530 |
5000w | 60230 | 3516 | 19414 |
三种规则引擎都支持动态规则,可以通过提供的api动态扩展规则
- 灵活性上看groovy和drools支持脚本编写方式,市面上有常见的包装方案;
- 其中QLExpression在中小企业应用较广泛对熟悉java的选手来说基本开箱即用;
- groovy和drools作为规则引擎在互联网企业应用较多,有一定的学习和培训成本;
- drools追随者更多适用面积更广泛;