打造属于你的业务规则引擎

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

介绍

规则引擎可以将业务决策逻辑从系统逻辑中抽离出来,使两种逻辑独立于彼此而变化,这样能够明显下降两种逻辑的维护成本。github

好比说在物联网平台中,链接的设备种类繁多,数据格式,数据类型不统一,但又要面临接入新设备的需求,不能说每接入一种设备,都要写一套设备数据处理的逻辑,而后升级发布系统的功能,设备处理逻辑能够写,但要能最低限度的影响平台的功能。这个时候,咱们最好须要一套规则引擎来灵活的处理各类设备的数据。编程

设计

思路

已经知道了为何要作规则引擎,要怎么处理呢,参考QLExpress使用说明文章:www.jianshu.com/p/c1fa9c4a0…bash

QLExpress是一种Java的规则引擎,能够动态的执行脚本,而且能够绑定一些咱们写好的Java函数做为动态执行脚本的操做。那么咱们将数据处理中最通用的内容封装为一个个QLExpress的组件,在数据处理的时候直接拿来使用便可。其实咱们能够考虑只是数据的处理,可能会有哪些组件:tcp

  • 获取数据点位(属性)组件,以便快速的获取数据中的某些想要的部分
  • 反馈组件,在规则执行结束后调用系统中的功能,通知业务规则执行完毕
  • 协议组件,能够有http,tcp,udp等,在组件中封装调用地址,数据包,请求地址
  • JSON、XML数据序列化组件,也许会产生新的数据,须要再处理一次

我以为上面这几个组件能够知足大部分的数据场景了,有来源,有处理,有反馈。固然在业务复杂的状况下,可能会不断的增长新的组件,可是每次增长要想想,这个组件真的有须要吗?编程语言

另外由于QLExpress已经支持动态脚本了,具备必定编程语言的特性,足够的灵活处理,封装咱们的组件只是为了那些更加通用,经常使用的场景,而最通用的东西通常不会不少。函数

image-20191012074002421

提供功能

  • 默认的规则组件,以及使用说明
  • 规则的增删改查接口
  • 规则执行接口
  • 额外暂不考虑

大致流程

1 整理好系统中最经常使用的功能,进行封装,将最经常使用的功能以某种方式(配置文件,动态加载),注册为QLExpress的某个操做符上。以下测试

runner.addFunctionOfClassMethod("取绝对值", Math.class.getName(), "abs",
				new String[] { "double" }, null);
runner.addFunctionOfClassMethod("转换为大写", BeanExample.class.getName(),
				"upper", new String[] { "String" }, null);

runner.addFunctionOfServiceMethod("打印", System.out, "println",new String[] { "String" }, null);
runner.addFunctionOfServiceMethod("contains", new BeanExample(), "anyContains",
            new Class[] { String.class, String.class }, null);
复制代码

2 在不一样的业务场景下,编写QLExpress语句,能够利用上一步注册到QLExpres上的功能简化语句。虽然是动态脚本可是要足够简单,业务要作到不用写几句代码就能知足此次需求,若是要写太多的语法,那就有点不太友好了。spa

3 在每一个编写的规则上,提供规则执行测试脚本,数据隔离防止产生脏数据,校验规则脚本可否正确执行。设计

4 将规则引擎的功能集成到平台上。

最后

QLExpress脚本引擎被普遍应用在阿里的电商业务场景中,支持常见的编程语法,足够强大,在QLExpress基础之上打造本身的业务规则引擎。

参考: QLExpress项目 QLExpress使用说明

相关文章
相关标签/搜索