什么是规则引擎,规则引擎到底长啥样?一般来说主要分为下面三类:
在各大社区中,开源的规则引擎还是比较多的,但整体上,大分类主要为下面三类:
下面,我们就更详尽的去说明一下这三类规则引擎的一些内容。
作为完全版的成熟的规则引擎,往往可以当作saas产品进行售卖,urule既有开源的部分,同时也在卖着自己的高级功能,drools则是一个纯开源的产品。在这些规则引擎里,它一般都会分成好几种规则设计器来满足你想要的规则场景:
通过上面这些不同的规则设计器,我们便可以设计出不同的规则场景,那么我们应该怎么去调用这些规则呢,一般来说主要有下面三种方式:
以上三种,大家可以根据自己的场景需求来选择合适的调用模式。
drools在互联网公司进行规则引擎调研的时候都会进入备选项,但是最后往往都会以太重,学习成本高而落选,轻量级的脚本语言最终会受到互联网公司的青睐。一般来说,下面三种比较轻量级的脚本语言会比较多的被大家用来做规则引擎:
1.高性能:Aviator的基本执行过程是将表达式直接翻译成对应的 java 字节码执行,整个过程最多扫两趟,这样就保证了它的性能超越绝大部分解释性的表达式引擎。
2.轻量级:Aviator 除了依赖 commons-beanutils 这个库之外不依赖任何第三方库,因此,整体非常轻量级,整个 jar 包大小哪怕发展到 5.0 这个大版本,也才 430K。
3.开放能力强:Aviator内置的函数库非常“节制”,除了必须的字符串处理、数学函数和集合处理之外,类似文件 IO、网络等等你都是没法使用的,这样便能有效保证 Aviator 运行期的安全。如果你需要更多的高阶能力,是可以通过开放的自定义函数来接入以及各种定制选项。
4.开发量少:Aviator 与脚本语言类似,使用表达式引擎也需要自行实现规则的组合和决策流的编排等功能,不过由于表达式的运行比较易于控制,所以 Aviator 减少了不少的基础开发工作。对于有界面的需求话需要和前端进行配合,让前端的一些控件能自动转换成这种表达式语言,就能完成自动化。
基于java的代码规则引擎往往是一种框架,我们基于框架限定的一些条件来进行实现。下面来看一个实例:如果我们有多个加编号的流程,比如猿辅导加上编号前缀tutor
,斑马的加上编号前缀conan
,搜题的加上编号前缀solar
,我们的普通写法是怎么写的呢?
if(biz == "猿辅导"){
tradeNo = "tutor" + tradeNo;
}else if(biz == "斑马"){
tradeNo = "conan" + tradeNo;
}else if (biz == "搜题"){
tradeNo = "solar" + tradeNo;
}
复制代码
通过if/else 进行处理,看起来这种写法也没什么大毛病,其实他破坏了开闭原则,比如我们增加或者修改逻辑的时候都需要去动这一段代码,如果不小心改错了影响到其他逻辑这就得不偿失了。那么我们如何通过easyRule完成我们的这个功能呢?
@Rule(priority = 1)
public class FudaoRule {
@Condition
public boolean isFudao(@Fact("biz") String biz) {
return biz == "猿辅导";
}
@Action
public void process(Facts facts) {
String tradeNo = facts.get("tradeNo");
facts.put("tradeNo", "tutor" + tradeNo);
}
}
@Rule(priority = 2)
public class BanmaRule {
@Condition
public boolean isBanma(@Fact("biz") String biz) {
return biz == "斑马";
}
@Action
public void process(Facts facts) {
String tradeNo = facts.get("tradeNo");
facts.put("tradeNo", "conan" + tradeNo);
}
}
复制代码
我们实现这两个不同的类,@Rule
注解中定义priority代表我们的if/else优先级, @Condition
就是我们的条件判断,如果属于则进入条件判断,@Action
是我们匹配之后的动作。通过这种方式如果后面再增加或者修改相关逻辑我们可以在不同的类里面去进行修改,也满足了我们的开闭原则。
另外,easyRules也支持使用yaml文件来进行规则的定义,类似我们之前的dsl,但是我觉得实现java类注解的方式是它的最大特点,很值得去了解学习。
以上便是对这三大类规则引擎的一个简单介绍。如果你还在被if/else的逻辑所困扰,如果你的产品或者运营人员老是吐槽你的开发更不上他的需求,那么请选择一款趁手的规则引擎去解决这些问题吧。地址:规则引擎专题。