上篇详细介绍了知识包的创建,启用、发布,快速测试和批量测试,点击链接知识包创建与发布
概述
在URule Pro当中是不能直接调用具体的规则文件的,我们需要先将定义好的规则文件放到知识包中,然后才可以对规则文件进行测试和调用。
本章会讲解在业务系统中如何调用规则引擎知识包
RESTFUL调用模式
在URule Pro中提供了统一的Restful服务调用接口,通过在知识包上进行简单的配置,即可实现将业务规则计算暴露成Restful接口,对于客户端来说,调用接口时,只需要符合要求的JSON格式数据即可实现业务规则计算,同时Restful接口也会返回统一的JSON格式数据作为计算结果输出。
知识包rest服务配置
右键点击知识包,看到rest服务配置点击
勾选启用服务,
配置窗口比较简单,我们需要做的就是配置好输入、输出数据以及调用时是否启用用户名密码验证即可。需要注意的是,输入输出数据必须要都配置好后才能保存,不能只配置输入数据不配置输出数据,反过来也是一样。
输入、输出信息配置完成,点击配置窗口下方的的“查看Restful描述”按钮,就可以看到当前知识包已配置好的Restful服务接口的描述数据,描述服务的格式为JSON,内容如下所示:
{
"output": [
{
"name": "团队奖金",
"fields": [
{
"name": "attendanceDays",
"type": "Integer",
"label": "出勤天数"
},
{
"name": "contribute",
"type": "String",
"label": "贡献度"
},
{
"name": "departmentAllScore",
"type": "Integer",
"label": "部门总评分"
},
{
"name": "departmentBonus",
"type": "Integer",
"label": "部门奖金"
},
{
"name": "departmentBonusScale",
"type": "Double",
"label": "部门奖金比例"
},
{
"name": "departmentScore",
"type": "Integer",
"label": "部门评分"
},
{
"name": "grossProfit",
"type": "Double",
"label": "公司总利润"
},
{
"name": "negativeComment",
"type": "Integer",
"label": "差评"
},
{
"name": "resignation",
"type": "Integer",
"label": "辞职书"
}
],
"clazz": "com.urule.entity.BonusShares"
}
],
"input": [
{
"name": "团队奖金",
"fields": [
{
"name": "attendanceDays",
"type": "Integer",
"label": "出勤天数"
},
{
"name": "contribute",
"type": "String",
"label": "贡献度"
},
{
"name": "grossProfit",
"type": "Double",
"label": "公司总利润"
},
{
"name": "resignation",
"type": "Integer",
"label": "辞职书"
}
],
"clazz": "com.urule.entity.BonusShares"
}
],
"url": "http://localhost:8080/urule/rest/101",
"authentication": false
}
在上面的JSON格式调用描述数据当中,“input”和“output”属性值分别表示输入和输出数据,“url”表示的是调用的URL;“authentication”属性值表示的是当前Restful服务调用是否需要用户名密码验证,这里的值是false,表示不需要验证。
需要注意的是,点击窗口下的任何一个按钮都会触发 保存操作。
注意:这里的输入、输出选择会受当前知识包引用的变量库、参数库的 用途属性影响,用途为In或InOut类型的变量或参数,会在输入中出现,用途为Out或InOut类型的变量或参数,会在输出中出现。
Restful接口调用测试
回到服务调用配置窗口,点击窗口下方的“Restful服务调用测试”按钮,就可以打开当前知识包的服务调用测试页面,如下图所示:
在测试页面当中,左边为要提交的JSON格式数据,这里引擎已将我们配置中定义好的输入数据转换成标准的JSON格式,我们只需要填充具体数据即可。
从图中可以看出,这里的JSON格式的输入数据,与我们想象中的对象的标准JSON格式略有不同。这里,要提交的输入数据可以有多个,所以JSON以"[ ]"包裹,表示为一个集合类型的数据(当然,如果你配置的输入数据对象只有一个,那就直接提交一个对象就行;这里的“团队奖金”对象,用name属性来标明对象类型,这里的name属性用的是我们规则变量库里定义的对象分类名,实际上,name属性值也可以是变量库里对象类路径全名,无论用哪个引擎都可以正确识别;接下来就是“fields”属性,它是一个对象类型,里面具体的属性用于标明当前对象需要的属性名及属性值,所有的属性值都是一个空的字符串,实际填写时需要根据对应属性数据类型进行具体值的填充。可以看到,这里对象属性名采用的是变量库里具体属性的“字段名”,而非“标题”,实际使用时即可以使用“字段名”,也可以使用“标题”,引擎都能正确识别。
了解输入的JSON数据格式后,接下来就可以填充JSON数据,填充完成后,点击工具栏上的“提交数据”按钮,即可将输入的数据提交到目标知识包所暴露的Restful服务接口。提交数据后结果如下图所示:
可以看到,计算后的输出数据是一个标准的JSON对象格式,“duration”属性值表示当前业务规则计算耗时,单位为毫秒(ms),这里是1,表示时间非常的短(通常第一次计算时间较慢,这由Java特性导致);“output”属性值为一个集合类型,通过“name”属性值来 标明对象名称,与变量库里定义的对象分类名保持一致;“class”属性则标明对象类全名,与变量库里定义的对象类路径一致;“fields”属性值是一个对象类型,用于标明当前对象的具体属性名及其值,这里的属性名采用的是属性的字段名,主要是方便后续JSON数据对象化处理。
上面的测试是通过URule内置的Restful服务测试页面完成,实际使用时也可以用第三方测试工具实现,比如上面的Restful服务就可以通过postman来进行测试,如下图所示:
如截图所示,在postman中,输入好请求的URL,我们这里是http://localhost:8080/urule/rest/101,提交类型改为POST(URule Pro提供的Restful服务只接收POST类型的请求),输入要提交的数据,我们这里是要提交的JSON数据,数据格式与上面介绍的保持一致,点击“Send”按钮,就可以得到响应结果。
在配置Restful服务时,还可以打开“用户名密码验证”选项,打开该选项后,我们需要输入用户名及密码信息,保存后再次请求这个Restful服务我们就需要在请求的Header里加上用户和密码信息,否则请求将不被允许,在URule Pro内置的Restful服务测试页面里, 如果当前Restful服务需要用户名密码验证,它会自动加上用户名密码信息;而如果我们使用postman来请求这个Restful服务,若不在Header里提供用户名密码信息,那么请求将会得到如下图所示信息:
我们可以在请求的Header中添加用户名密码信息,Header的Key分别是Username和Password,如下图所示:
实际应用当中,我们会在应用在外层加上业务系统的安全管理功能,比如使用系统需要先进行登录等,这时要保证URule Pro中内置的Restful服务可用,那么就需要让 /urule/rest这个URL可匿名访问,这点非常重要。
在使用这个内置的Restful服务过程中,如果出现错误,比如用户名密码不正确或规则计算过程出现异常等,类似这些错误信息也会以一个标准的JSON格式返回,所有的错误消息(如果是异常则是异常的堆栈信息)会放在返回的JSON对象的error属性中, 如果没有错误,则返回的JSON中就不会包含error属性,这点从上面的示例中我们也已经看到。
在业务系统中调用:
package com.urule.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@Slf4j
public class UruleController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private ObjectMapper objectMapper;
@PostMapping("/getPayLoan")
public String getLoanPay() {
String url = "http://localhost:8080/urule/rest/101";
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
//参数一
String json = "[\n" +
" {\n" +
" \"name\": \"团队奖金\",\n" +
" \"fields\": {\n" +
" \"contribute\": 优秀\"\",\n" +
" \"attendanceDays\": 21,\n" +
" \"resignation\": 2,\n" +
" \"grossProfit\": 5000\n" +
" },\n" +
" \"class\": \"com.urule.entity.BonusShares\"\n" +
" }\n" +
"]";
//参数二
ObjectNode objectNode = objectMapper.createObjectNode();
ObjectNode jsonNodes = objectMapper.createObjectNode();
jsonNodes.put("contribute", "优秀");
jsonNodes.put("attendanceDays", 21);
jsonNodes.put("resignation", 2);
jsonNodes.put("grossProfit", 10000);
objectNode.put("name", "团队奖金");
objectNode.put("class", "com.urule.entity.BonusShares");
objectNode.put("fields", jsonNodes);
ArrayNode arrayNode = objectMapper.createArrayNode();
arrayNode.add(objectNode);
System.out.println(arrayNode.toString());
HttpEntity<String> httpEntity = new HttpEntity(arrayNode.toString(), httpHeaders);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
System.out.println(responseEntity.getBody());
return responseEntity.getBody();
}
}
上面写了两种传参方式,测试结果
规则监控
规则监控针对的是对知识包调用的监控。在URule Pro当中,规则是放在知识包是调用的,所以规则监控也就是对知识包的监控。
打开项目的知识包页面,在已启用的知识包上点击右键,在弹出菜单中选择知识包调用监控配置,如下图所示:
点击该菜单项,即可打开针对当前知识包的监控配置窗口,然后勾选“启用对当前知识包的调用监控”选项,即可开始配置具体的要监控的信息。如下图所示:
监控配置
勾选“启用对当前知识包的调用监控”选项后,就可以看到具体可配置的监控选项,整个监控的选项分为两个部分,既输入数据以及输出数据。
当前知识包中规则如果开启“允许调试信息输出”属性,同时运行项目中将urule.debug属性配置为true,那么监控时会自动记录规则运行时产生的日志。
之前我们对规则中“允许调试信息输出”属性以及运行项目中urule.debug属性有过介绍,要求在生产环境中一定要把urule.debug属性设置为false,这样所有的调试信息都将不再产生,就不会对性能产生影响。
监控配置窗口会把当前知识包中用到的所有变量及参数根据其用途属性罗列出来,我们需要做的就是根据需要进行勾选,这样在监控运行时会所勾选的输入以及输出信息都记录下来,给我们自定义的监控实现类使用。
监控配置窗口在输入数据部分只会罗列变量及参数中用途为 In及InOut类型,输出只会罗列 Out及InOut类型。
注意:监控操作针对的是规则的执行,规则执行调用的是已发布的知识包,因此,监控中配置的输入和输出变量及参数也是来自当前知识包中处于 启用状态的已发布的知识包。所以配置知识包监控,要确保当前知识包已经发布,且处于启用状态的已发布的知识包必须是我们需要的那个。
如果我们当前调用规则采用的是Rest服务方式,那么配置好监控内容后,在通过Rest服务调用规则时系统会自动根据这里的配置对规则调用进行记录监控,无须再做别的配置。
知识包多环境部署
URule Pro是一个全生命周期规则服务管理的规则引擎,提供了从规则的创建、测试、发布、服务管理等完整的管理功能。推荐用户通过同一套环境中完成从无到有的整个业务规则服务的管理。
但还存在另外一种情况,部分用户存在多个部署环境的隔离限制,规则的配置,完成测试、再发布到生产环境,生产环境只提供规则计算服务,不对规则进行设计和修改。
URule Pro从4.1.0版本开始提供知识包上传的功能满足这种情况。
知识包版本导出
在查看选择测试好已发布的知识包版本,右键导出data文件。
知识包导入
将导出的data文件导入到需要部署的环境。
点击添加知识包,
点击上传知识包
启用上传知识包
启用上传完知识包后,知识包的所提供的的服务与之前知识包一致。
需要注意一下几点:
如果当前知识包中有通过规则调用其他知识包的动作,由于当前环境中可能不存在被调用知识包,会导致调用失败。
已经通过上传启用的知识包,后续如果【修改】绑定上传知识包,重新上传data文件,在保存后会同步到集群管理中配置的其他节点,客户端推送需要在知识包右键菜单中,点击【推送到客户端】。
总结:
在业务系统中调用规则引擎知识包,需要先配置urule知识包,打开rest服务,配置出入参,然后在业务系统中通过调用知识包暴露的URL调用,方便业务系统调用urule规则引擎。