转载

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

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

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

设计

思路

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

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

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

我觉得上面这几个组件可以满足大部分的数据场景了,有来源,有处理,有反馈。当然在业务复杂的情况下,可能会不断的增加新的组件,但是每次增加要想一想, 这个组件真的有需要吗?

另外因为QLExpress已经支持动态脚本了,具有一定编程语言的特性,足够的灵活处理,封装我们的组件只是为了那些更加通用,常用的场景,而最通用的东西一般不会很多。

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

提供功能

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

大体流程

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上的功能简化语句。 虽然是动态脚本但是要足够简单,业务要做到不用写几句代码就能满足这次需求 ,如果要写太多的语法,那就有点不太友好了。

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

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

原文  https://juejin.im/post/5da116c06fb9a04ded311e7a
正文到此结束
Loading...