规则引擎 | 青训营笔记

419 阅读7分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

前言

大家好呀,这是我参加青训营伴学笔记创作活动的第 15 天,如存在问题,烦请各位斧正!

其中有一些关键图片超过了最大字符限制,不能上传了,我都使用特殊标记给它标记出来了,如有需要,请联系我。

入门

使用场景

  1. 用于页面,流程,扩展点实现的选择;输出结果:实现的位置;
  2. 编排无数的条件积木和行为积木,达到业务逻辑计算,券库存消减的目的;输出结果:商品重计算后的价格;
  3. 通过订单,售后单,会员等信息编排和判断,达到多因子决策给出最佳答案的效果;输出结果:响应式回答/营销推荐,也或分步骤完成某类表单(售后申请,或工单提交);
  4. 过订单消息的触发,和商业化协议的元数据输入,形成结构化的计费记录;输出结果:计费凭证;

业务配置-条件积木,以及应用的授权逻辑,都有非常多的规则管理,由于业务的变化大,需求迭代快,需要不断的嵌套规则,硬编码开发。基于业务需要,希望能建立规则引擎,将规则代码从业务中抽离出来,降低规则迭代成本,降低if else等的规则嵌套,增强代码的维护性和复用性。开发人员不用过多的关注逻辑判断,可以专注与逻辑处理。

有很多规则,如校验是通过if else逻辑硬编码完成,商品目前支持电商、零售等业务部门,无非就是两种情况:一种是商品领域模型的变更,还有一种是规则的变更。可以说,支撑上层业务,业务规则占了需求的半边天。

通用的业务规则引擎,不和自己的业务藕合,提供一个通用的规则引擎是可行的。

什么是规则引擎

规则引擎是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。

规则本质上是一个函数,如y=f(x1,x2,..,xn)

规则引擎由三部分

事实(Fact):就是用户输入的已经事实,可以理解为推理前的已知对象。
LHS(Left Hand Side):可以理解为规则执行需要满足的条件。
RHS(Right Hand Sike):可以理解为规则执行后的返回对象。

两个重要模块:

规则管理:可以理解为逻辑上管理规则,主要涉及规则、事实对象和规则集三个实体。涉及到规则变更时,最好对规则加个版本,可通过规则版本控制,可以平滑灰度地方式改变规则,也便于更有信心在测试规则正确性。
规则执行:通过规则库数据,通过规则引擎的规则解析、规则编译将可执行代码缓存起来,避免每次和DB交互,然后每次规则的变更也通过ZK或者DCC实时通知给规则执行器。规则执行器的实现方式,可以多种多样,不依赖于规则库的存储方式,可以根据需求,选用Drools、Aviator等第三方引擎,甚至可以基于ANTLR定制。

Maven的配置

<dependencies>
    <dependency>
        <groupId>org.kie</groupId>
        <artifactId>kie-api</artifactId>
        <version>6.5.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>6.5.0.Final</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

规则引擎推荐

1 Drools

drools 是一款由 JBoss 组织提供的基于 Java 语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中) ,使得业务规则的变更不需要修改项目代码、不用重启服务器就可以在线上环境立即生效。

使用最为活跃、广泛并且开源。 Drools 中文网 | 基于 java 的功能强大的开源规则引擎

Drools - Business Rules Management System (Java™, Open Source) 推荐书籍《Drools 规则引擎技术指南》

2 Easy Rules EasyRule 是轻量级的规则引擎 API。

它提供 Rule 抽象来创建带有条件和动作的规则,以及 RulesEngine 通过一组规则运行以测试条件和执行动作的 API。

通过注解、链式编程、表达式、yml 文件 等方式灵活选择使用 The simple, stupid rules engine for Java

3 Bstek 锐道:URULE PRO 规则引擎 URule Pro 是一款由上海锐道信息技术有限公司自主研发的纯 Java 规则引擎,提供规则集、决策表、交叉决策表(决策矩阵)、决策树、评分卡、复杂评分卡、规则流等八种类型的业务规则设计工具, 采用业内首创的纯浏览器编辑模式,打开浏览器即可开始复杂规则的设计与测试 Urules 文档 测试账号:uruletest10086

测试密码:dakou2010

4 Aviator Aviator 是一个高性能、轻量级的 java 语言实现的表达式求值引擎,主要用于各种表达式的动态求值。 AviatorScript 文档

5 VisualRules 旗正 VisualRules 是由国家科技部和财政部的创新基金支持,专门针对国内规则引擎市场空白的情况,结合国内项目的特点而开发的一款业务规则管理系统(BRMS)产品。

6 iLog BM WebSphere ILOG JRules 是目前业界领先的业务规则管理平台。与传统的由 IT 人员用硬代码来维护规则的做法不同,ILOG JRules 让业务用户能够在不依赖或者有限依赖于 IT 人员的情况下,快速创建、修改、测试和部署业务规则,以满足经常变化的业务需求。ILOG JRules 提供了一整套的工具,帮助开发人员和业务人员进行规则的全生命周期管理。

7 OpenL Tablets OpenL Tablets 业务规则引擎(BRE)和业务规则管理系统(BRMS),属于商业规则引擎。

8 QLExpress 由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神,于 2012 年开源。 QLExpress: 规则引擎 (gitee.com)

9 liteFlow 轻量,快速,稳定,可编排的组件式规则引擎/流程引擎。 拥有全新设计的DSL规则表达式。 组件复用,同步/异步编排,动态编排,复杂嵌套规则,热部署,平滑刷新规则等等功能,让你加快开发效率! QLExpress: 规则引擎 (gitee.com) 官网

Aviator表达式求值引擎

Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎,主要用于各
种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎,为什
么还需要Avaitor呢?
 
Aviator的设计目标是轻量级和高性能 ,相比于Groovy、JRuby的笨重,Aviator
非常小,加上依赖包也才450K,不算依赖包的话只有70K;当然,Aviator的语法
是受限的,它不是一门完整的语言,而只是语言的一小部分集合。
 
其次,Aviator的实现思路与其他轻量级的求值器很不相同,其他求值器一般都
是通过解释的方式运行,而Aviator则是直接将表达式编译成Java字节码,交给
JVM去执行。简单来说,Aviator的定位是介于Groovy这样的重量级脚本语言和
IKExpression这样的轻量级表达式引擎之间。