规则引擎rule-engine v1.0实现解释(一)-规则,执行,容器
简介
规则引擎,就是一种用于管理和执行业务规则的组件。它将业务逻辑从应用程序中剥离出来,以规则的形式进行定义和存储。当需要执行某个业务逻辑时,规则引擎会根据输入的数据,通常是业务类,预定义的规则进行匹配和推理,从而生成相应的操作指令或者决策结果。规则可以以代码实现,但通常规则变更频繁,周期未必与软件同步,因此,规则多用dsl定义,解释执行。
本文解释规则引擎的实现,规则模型,执行和容器部分。
特性
V1.0 规则,规则执行,执行容器
V2.0 规则编写辅助
术语/关键词
规则/事实 事实是执行规则的参数,通常是业务相关的类,规则使用事实为基础的一系列的运算,逻辑处理,得出结论或决策
参考资料
common-jexl语法 Apache Commons JEXL Syntax ? JEXL
关于选型
最初关注drools,研究后,drools相当重,使用不便,学习曲线陡,放弃。回想起之前datax的基于规则的转换器,cdc权限同步,使用过轻量级的规则引擎,如下图
支持if/else,使用工具类,语法类似js,功能强大,使用简单,因此规则引擎继续选用common-jexl
技术架构
上图规则引擎的技术架构图,两个场景
- 规则编写与业务同一进程
该情况最方便,业务类已载入jvm,规则引擎可直接使用业务类作为事实
- 规则编写与业务不同进程
这种情况统一编写规则,独立一个应用,如果规则使用业务类作为事实,需要动态载入业务包
逻辑架构
下图是规则引擎的逻辑架构
spring boot starter spring boot自动配置
rule-executor 执行器,负责构建执行容器,构建规则,执行规则
rule-core 规则模型,规则读写
bean-repository 工具库,工具类的注册,动态加载
实现解释
本节详细介绍各模块的详细设计
工程
工程结构与5 逻辑结构一致,这里不重复解释
设计模型
上图主要的设计类,比较直观,不多叙述
spring boot starter
自动配置引用两个bean配置,规则和执行器
API
- 执行规则,规则在发布状态,支持一个事实和两个事实
public <R> R executeRule(String ruleName, Object fact)
public <R> R executeRule(String ruleName, Object fact1, Object fact2)
- 测试规则,执行草稿状态规则,支持一个事实和两个事实
public <R> R executeRuleTest(String ruleName, Object fact)
- 预览规则,预览执行在编辑状态的规则,支持一个事实和两个事实
public <R> R executeRulePreview(String ruleScript, Object fact)
开发示例
依赖
规则引擎提供spring-boot-starter,使用spring boot的自动配置机制构建组件
引用
Starter构建规则执行器,直接注入即可使用
配置
上图是规则引擎配置,script是使用xml,后续生产使用数据库,tools配置执行容器的工具类
编写规则
上图是简单规则例子,展示if/else,运算,工具类调用,单事实/两个事实
NEXT
- 规则编写辅助
规则编写使用工具类,事实(业务类),列表类型,类型方法和参数提供辅助
- 低代码编写规则
预置组件,拖拉拽构建规则脚本