1.产品简介
规则引擎是一种嵌入在应用程序中的组件,它可以将业务规则从业务代码中剥离出来,使用预先定义好的语义规范来实现这些剥离出来的业务规则;规则引擎通过接受输入的数据,进行业务规则的评估,并做出业务决策。
因为规则引擎将复杂的业务逻辑从业务代码中剥离出来,所以可以显著降低业务逻辑实现难度;同时,剥离的业务规则使用规则引擎实现,这样可以使多变的业务规则变的可维护,配合规则引擎提供的良好的业务规则设计器,不用编码就可以快速实现复杂的业务规则,同样,即使是完全不懂编程的业务人员,也可以轻松上手使用规则引擎来定义复杂的业务规则。
业务系统运行过程中难免会发生业务规则变化的情形,有了规则引擎,业务规则部分采用的是规则引擎实现,这样在系统正常运行的情况就可以利用规则引擎对业务规则进行修改,从而实现业务规则的随需应便。
URule Pro是一款由上海锐道信息技术有限公司自主研发的一款纯Java规则引擎,它可以运行在Windows、Linux、Unix等各种类型的操作系统之上; URule Pro的规则设计器采用业内首创的纯浏览器编辑模式,无须安装任何工具,打开浏览器即可完成复杂规则的设计与测试。
URule Pro技术交流QQ群:566257889(加群时请注明来意,否则将不会通过)
URule Pro标准视频教程:https://www.bilibili.com/video/av57111513
保险业务示例视频教程:https://www.bilibili.com/video/av73008171
电费计算示例视频教程:https://www.bilibili.com/video/BV16e411x77u/
飞机机位分配示例视频教程:https://www.bilibili.com/video/BV1pC4y1s7XP/
贷款还款计划计算视频教程:https://www.bilibili.com/video/BV1FT4y1G7ZL/
我们可以从以下几个方面来了解URule Pro。
强大的功能
在URule Pro当中,提供规则集、决策表、交叉决策表(决策矩阵)、决策树、评分卡、复杂评分卡、规则流等八种类型的业务规则设计工具,从各个角度满足复杂业务规则设计的需要。
如果您需要在业务规则当中进行科学计算,同时要求计算时采用标准的数学符号,那么URule Pro可能是最佳选择。
在URule Pro当中提供了15大类,近40个小类的常用数学符号,可进行几乎所有类型的可视化的科学计算,URule Pro应该是目前市面上唯一一款能进行可视化科学计算的规则引擎。
如果我们的业务给出的是零散的逻辑规则,那么可以使用规则集来实现;如果给出的是表格形式的业务规则,那么可以直接使用对应的决策表或交叉决策表(决策矩阵)来实现;如果需要对实体进行综合评分,则可以使用评分卡或复杂评分卡来实现;最后还可以通过规则流对一系列复杂的规则个体进行编排,将这个规则流作为实际业务规则调用入口,从而实现任意复杂的业务规则。
无论是规则文件的部署,还是规则中要调用的Spring Bean以及相关的Java类的加载,URule Pro全部采用热部署功能实现(参见Spring Bean及Java类的热部署),系统不重启即可实现所有与规则相关的业务需求变更。
简单的使用方式
URule Pro中提供的所有的规则设计器及打包测试工具,全部基于浏览器实现,所有的规则设计器皆为可视化、图形化设计器,通过鼠标点击即可实现复杂的业务规则定义,URule Pro中规则的多条件组合也是以图形方式展现,这样即使没有任何编程经验的普通业务人员,也可以轻松上手,完成复杂业务规则的定义。
因为所有的业务规则设计器都是基于网页的,且规则的定义都是通过鼠标点击的方式完成,所以对于一个普通的使用者来说,配合教学视频两到三天即可完全掌握URule Pro中各种设计器的使用,结合业务需要定义出想要的业务规则。
优秀的性能
URule Pro后台采用纯Java实现,运行时借鉴Rete了算法的优势,再结合中式规则引擎的特点,独创了一套自己的规则模式匹配算法,这套算法可以从根本上保证规则运行的效率,实现大量复杂业务规则计算时的毫秒级响应。
完善的版本控制机制
在URule Pro当中,无论是单个规则文件、或是用户调用的规则包,都提供了完善的版本控制机制。对于规则文件来说只要有需要,可以回退到任何一个历史版本; 对于给用户调用的规则包,可以在不同的历史版本之间灵活切换。
架构
系统架构图
从上图中可以看到,使用者通过浏览器打开URule Pro规则设计器来定义业务规则,完成后的业务规则文件会被存储在规则存储仓库中(在URule Pro当中规则存储仓库既可以是文件系统中的某个目录,也可以存储于数据库当中)。规则文件调用时引擎会从规则存储仓库里把指定的规则文件取出,再通过规则构建引擎对规则进行解析、编译,最后由规则执行引擎执行并返回结果。
技术架构图
运行模式
实际使用时,有四种使用URule Pro的方式,分别是嵌入式模式、本地模式、分布式计算模式以及独立服务模式。
嵌入式模式
所谓的嵌入式,是指将URule Pro直接嵌入到我们的Java Web应用当中,作为应用的一部分运行。这种模式的好处是配置起来比较简单;而不好的地方在于因为将URule Pro直接嵌入到我们的应用当中,如果我们有多个涉及到规则引擎的应用, 那么每个应用都需要嵌入一个URule Pro模块,所以更多的时候我们使用的是独立服务模式。
本地模式
本地模式类似于嵌入式模式,所不同的是嵌入到我们客户端应用中的URule Pro模块仅仅为其规则计算部分(core部分),不含设计器部分(console部分); 之后将测试好的知识包导出为一个.data格式文件,然后把文件放在客户端应用的一个指定目录下或数据库中,这样客户端应用在调用知识包时就直接到这个指定目录下或数据库中查找目标.data文件并加载。
这种模式非常适用于规则运行环境封闭,且需要对外部屏蔽规则设计细节的应用需要,其部署模式简单、快捷,一旦有新的知识包放入指定目录中,客户端应用会自动检测并加载新的版本。
分布式计算模式
分布式计算模式是指将URule Pro部署为一个独立的Java Web应用,在这个应用里定义各个业务系统所需要业务规则,定义好后统一存储到一个规则存储仓库当中。 业务系统要使用规则时只需要指定URule Pro Server的地址即可通过HTTP协议取到目标规则包,然后解析并运行,其运行模式图如下所示:在分布式计算模式下, 一个URule Pro Server可以下挂多个需要用到规则引擎的业务系统,但实际的业务规则在运行时还是发生在各个业务系统中,而不是URule Pro Server上,所以称之为分布式计算模式。
各个业务系统在运行业务规则时,会首先检查要运行规则对应的规则包在本地缓存中是否存在,如果存在则直接使用,不存在则通过配置的URule Pro Server地址向Server发出使用对应规则包的请求, URule Pro Server收到请求后会将指定的规则包序列化成JSON,通过HTTP协议传递给请求的业务系统。业务系统收到传递过来的规则包后,会首先对其进行反序列化,将JSON格式的规则包反序列化为Java对象并在本地缓存下来,然后再使用这个规则包进行业务规则的计算。
可以看到,在这个过程当中,URule Pro Server只负责业务规则的定义、编译与发布,不负责具体的业务规则执行,具体的规则执行还是发生在各个业务系统当中,可以大大减轻URule Server的压力,使得规则的计算可以分布到各个业务系统所在的服务器上, 从而可以根据需要对计算规则的服务器进行灵活的扩充。
独立服务模式
独立服务模式也是规则引擎的传统运行模式,那就是把规则的调用以一个Restful服务的形式对外提供,客户端可以是Java、C#、C++或Javascript,客户端只需要把标准的JSON格式的输入数据提交给规则服务器,服务器调用规则计算完成后会以JSON格式作为响应返回。Restful服务支持安全验证, 提供完善的调用测试页面,同时对于输入数据,还支持复杂的JSON数据嵌套,以最大限度满足复杂业务需求;对于大批量并发调用,URule Pro提供完整的集群支持。
分布式计算模式下的规则包更新
在分布式计算模式下规则包的更新有两种方式:一种是主动推送方式;一种为定时更新的方式。
主动推送方式是指URule Pro Server在规则包更新后,会主动将更新后的规则包通过HTTP协议推送到配置好的各种业务系统应用的缓存当中,这样各个业务系统中的规则包就可以与Server中的规则包时刻保持一致, 但这种推送方式要求对应的各个业务系统应用必须是一个标准Java Web应用,否则这种推送无法实现,如果您的业务系统应用是一个Java应用,而非一个标准的Java Web应用,那么要更新规则包就不能采用这种推送方式,而需要使用定时更新的方式。
定时更新方式是指具体调用规则的业务系统,可以通过相应的参数配置,周期性的检查URule Pro Server上当前业务系统用到的规则包是否有更新,如果有则主动从Server上取下来并序列化成Java对应缓存到当前业务系统中备用,如果没有更新则不做任何操作。
所以如果您的业务系统是一个非Java Web应用,那么更新规则包可以采用定时更新的方式实现;相反如果您的业务系统是一个标准的Java Web应用,那么主动推送和定时更新两种方式都可以,当然主动推送的方式更为合适。
对科学计算的支持
在URule Pro当中提供了平方根、方根、乘方、分数、指数、对数、自然对数、绝对值、圆周率、向上取整、向下取整、极值、三角函数、反三角函数等15大类, 近40个小类的常用数学符号,这些数学符号可以在规则的动作定义部分当中, 可进行几乎所有类型的可视化的科学计算, URule Pro应该是目前市面上唯一一款能进行可视化科学计算的规则引擎。
这些数学符号在规则动作中使用效果如下图所示:
规则设计器
URule Pro当中提供了向导式规则集、脚本式规则集、决策表、交叉决策表(决策矩阵)、决策树、评分卡、复杂评分卡、规则流八种类型的业务规则设计工具,我们来看看这些设计器以及它们设计出来的规则的样子。
向导式规则集
规则集也叫决策集,是由一系列单个普通规则以及循环规则构成的,规则集设计器采用全向导方式,通过鼠标点击就可以完成规则配置。
定义好的普通规则如下图:
定义好的循环规则如下图:
脚本式规则集
如果使用URule Pro的是一名程序员,那么在编写规则的时候,可能会更倾向于使用脚本方式业定义业务规则。在URule Pro当中向导式规则集能实现的功能脚本式规则集全部可以实现,反之亦然。
脚本式规则集编辑器是一个基于浏览器技术的脚本编辑器、提供了完善的关键字及BOM信息提示、脚本合法性的实时检测、语法错误提示、适合业务人员使用的中文关键字等功能。
在脚本式规则编辑器里,既可以定义英文关键字脚本式规则,也可以定义中文关键字的脚本式规则,还可以定义中英文混合关键字的脚本式规则。
决策表
与普通的规则集(决策集)相比,决策表是通过一个二维表的方式来定义一批规则,在URule Pro当中,一张决策表分为左右两部分,左边部分是条件部分,右边部分为条件满足后的动作部分,如下图所示:
同样,决策表设计器也是基于浏览器支持构建,通过鼠标点击就可以完成整个决策表的定义。
交叉决策表(决策矩阵)
普通决策表是通过纵向一个维度的条件来实现规则的约束,而交叉决策表(决策矩阵)则是通过横向和纵向两个维度进行条件约束,两个维度交叉生的单元格就是实际业务规则生效的条件,因为这种样式有些类似于我们报表中的交叉表,所以称之为交叉决策表,也叫决策矩阵。
可以看到,交叉决策表的特点使得其可以定义更为复杂的交叉类型的业务规则。
决策树
之所以称之为决策树,是因为业务规则以树形方式展现。在URule Pro当中的决策树,是一棵平躺的树,设计成平躺的目的是为了可以展现树的更多内容,更好的利用显示空间。
普通评分卡
普通评分卡是URule Pro当中专门为简单评分系统而设计的一种业务规则工具,它可以针对某个实体对象的属性条件进行评分,每个属性在条件满足后还可以添加权重支持,同时对于得分的计算方式提供求和、加权求和以及用户自定义方式,以最大限度满足业务系统评分规则的需要。
复杂评分卡
在URule Pro提供的普通评分卡当中,只能针对某一个对象的一些属性进行评分,这种评分方式可以满足大部分评分系统的需求,但在某些复杂的评分需求中,需要对多个对象的不同属性进行叠加组合评分,针对此类需求,URule Pro提供了复杂评分卡功能。复杂评分卡的配置方式与决策表有些类似,只是对于条件列头只能选择具体的对象,而每个条件单元格在配置条件时都需要选择与当前列头选择的对象对应的具体属性,这样就可以满足任意复杂的评分需求。
规则流
无论是普通的规则集,还是决策表或评分卡,这些规则工具都只能完成一个复杂业务规则需求的一个点,所以对于完成的业务需求实现来说,还需要有工具把这些点串起来,这个工具就是规则流,也叫决策流。
URule Pro当中提供的规则流可以把前面介绍的这些普通的规则集,决策表或评分卡串起来,实现对已有规则的可视化编排功能。
在实际的业务系统中往往都是以规则流作为业务规则的调用入口,通过规则流将所有的以点形式存在的规则编排起来执行,从而可以实现任意复杂的业务规则需求。
规则的打包与调用
按照业务需求将规则文件定义好后,就可以将涉及到的所有规则文件打包备用。打包方式是点击URule Pro规则项目导航上的“知识包”节点,在出现的页面当中,就可以将规则文件打包成一个个待调用的知识包,如下图所示:
一个知识里面可以包含若干个具体的规则文件,这些文件可以是若干个规则集(决策集)、决策表、交叉决策表(决策矩阵)、评分卡、复杂评分卡以及决策流。需要注意的是,规则文件里引入的库文件(变量库、参数库、常量库以及动作库文件)是不需要导入的,引擎会自动处理规则中包含的库文件。
知识包配置完成后,可以对当前知识包进行测试。URule Pro提供了三种类型的针对知识包的测试,一种为用户选择输入测试值的快速测试,一种为输入复杂JSON的快速测试,另一种为支持基于Excel批量数据的“仿真测试”。
这其中用户选择输入测试值的快速测试在配置好测试项,点击并成功测试后,引擎会将测试配置及输入内容保存下来,这样下次就可以直接使用上次配置的快速测试内容。
点击知识包项菜单列菜单按钮,在弹出的菜单中选择的“快速测试”按钮就可以对当前知识进行测试,在测试页面当中选择添加并输入相关测试数据即可进行快速测试, 然后再点击工具栏上的“测试决策包”按钮就可以对当前知识包里除规则流以外所有类型的规则进行测试,如果当前知识包里有规则流文件,那么就需要点击工具栏上的“测试决策流”按钮来对目标决策流进行测试,如下图所示:
如的果我们测试时输入项较多,那么用默认快速测试功能一个个添加就比较麻烦,为此URule Pro专门提供了一种基于JSON数据的快速测试功能,点击菜单项中的“基于JSON的快速测试”,在弹出的窗口中 可以在输入项中把要输入的JSON数据直接粘贴进去,同时选择好相关的输出对象即可,如下图所示:
点击知识包菜单项中的“仿真测试”就可以对当前知识包进行基于方案的复杂场景仿真测试,仿真测试有专门的章节介绍,这里不再赘述,具体见知识包测试。
知识包测试完成后,就可以对其进行发布,发布方式是通过点击工具栏上的“发布知识包”按钮完成,每次发布的知识包,都会以版本形式保存下来,运行时可以在已发布的知识包版本间灵活切换。
综合来看,在URule Pro当中调用规则的示意图如下所示:
通过URule Pro中的知识包,就可以将定义在XML中的业务规则编译成具体的由Java对象构成的可执行的对象,在实际的业务代码当中,我们就可以通过相关API获取到这个知识包对象,插入相关业务数据并执行,从而获取业务规则执行结果。