概要
EasyRules是一个简单实用的规则引擎,Rule Engine的作用就是分离判断逻辑和对应的执行逻辑的,即不要写一堆的if…else代码,这样会让人很难理解与维护。EasyRules就可以帮你做到这点。
Easy Rules的灵感来自于Martin Fowler的文章Should I use a Rules Engine。
文章中这句话正是描述了Easy Rules所做的事情:
You can build a simple rules engine yourself. All you need is to create a bunch of objects with conditions and actions, store them in a collection, and run through them to evaluate the conditions and execute the actions.
应用场景
现在大多数企业公司的业务系统的业务规则都是很复杂而且变化很快的,开发人员又必须要快速的响应这些需求,那么如果代码写的不好,需要在复杂繁乱的规则中修改或新增,则容易不小心踩坑,引起线上bug。即使你小心翼翼的改代码,也会存在维护成本,导致效率低下。
hard code带来的问题:
(来源:网络)
使用
EasyRules的使用还是比较简单的,不然就对不起easy这个字了。
使用前要清楚一些概念:规则(Rule)、条件(Condition)、行为(Action)。在一个规则中,达到了某个条件,就会触发一些行为。
例子:
以下是我定义的两个规则
1 | "my rule1", description = "my rule description", priority = 1) (name = |
跑起来试试:
1 | (SpringJUnit4ClassRunner.class) |
由于type==1,所以触发MyRule1的行为。很easy是吧。
除了这个简单的演示外,EasyRules还是支持:
- 编程式定义规则,其中包括Fluent API、MVEL
- 支持yml文件加载规则
- RuleListener
- 等等
更详细的使用方法请自行看官方文档
实现原理
在EasyRules中有两个核心的配置,一个是条件Condition,一个是执行方法Action。
EasyRules的实现是通过实现Rule接口,或者通过代理 + 注解来找到Condition和Action,再用Facts对象作为类似context来传递上下文的信息。
在使用的角度来看,EasyRules无非做了两件事情,一是加载规则,二是执行规则,下面我们从两个方面入手看看它的实现原理。(源码基于:org.jeasy:easy-rules-core:3.4.0)
加载规则
可以看到register用来注册或加载规则:
1 | //规则集合 |
RuleProxy.asRule方法:
1 | /** |
RuleProxy的invoke方法:
我们重点看看代理后的evaluate和execute,它们分别代表Condition方法和Action方法
1 |
|
执行规则
执行规则看RulesEngine的fire方法:
1 |
|
规则引擎
EasyRules的特点就是easy,但是一般人们提到“规则引擎”可能是一个很“大”的东西,例如像drools那样,这种规则引擎无疑功能强大,但也很“笨重”,学习成本高。就像Martin Fowler说的,现在很多人都倾向于使用轻量级的、灵活的、embedded的规则引擎,总之合适的就是最好的。
一套完整的规则引擎可能是一个很复杂系统,它包括不限于建立规则语言标准,动态编辑,自动化执行等等,它还可以提供一个平台给业务、产品人员或者开发人员编写规则,根据特定的算法推理出模型。
所以,EasyRules是否你需要的呢?