Biz-SIP金融级业务中台(http://bizsip.bizmda.com)是一套基于领域驱动设计(DDD)架构,能快速构建金融级云原生架构的服务整合中间件,整合了在金融场景里锤炼出来的最佳实践。
风控规则是在App层进行处理的,如果当前App服务配置了风控规则,就会在App服务处理前,自动进行风控评价,根据评价结果决定是否继续执行App服务,并在App服务执行成功后更新风控相关指标数据。
案例要求:
通过Biz-SIP的开放API接口发送请求,针对指定的App服务配置风控指标和风控规则,在调用App服务时,就会根据进行风控规则的检验,校验出错会返回出错信息,校验通过后,会调用App服务后直接返回:
具体代码和配置可以查看Biz-SIP源代码中的Sample相关测试案例(https://gitee.com/szhengye/biz-sip)
一、App服务的开发和配置
首先,我们需要编写一个App服务类(Sample1AppService.java):
@Slf4j@Servicepublic class Sample1AppService implements AppBeanInterface { @Override public JSONObject process(JSONObject message) throws BizException { log.debug("收到请求数据:\n{}", BizUtils.buildJsonLog(message)); return message; }}
Sample1AppService类继承了AppBeanInterface接口,实现了process()方法,这个方法的输入输出参数,都是平台统一的JSONObject对象。
可以看到在process()方法中,对输入报文没有做任何修改,是直接把原报文返回的。
然后,在Biz-SIP统一配置目录中的app.yml中,配置对应的App服务:
- app-service-id: /bean/sample1-control-rule type: app-bean-service class-name: com.bizmda.bizsip.sample.app.service.Sample1AppService
二、App服务的风控指标和风控规则配置
首先,在配置目录下的control-rule.yml文件中,配置风控指标:
metrics: - name: metric-sample1-1 desc: 每分钟交易度量 fliding-window-time: 60000 - name: metric-sample1-2 desc: 每分钟交易对手度量 fliding-window-time: 60000
可以看到,我们配置了2个风控指标metric-sample-1、metric-sample-2,滑动时间窗口为60000ms,即60秒(1分钟)。
然后,在配置目录下创建并配置“/control-rule/bean/sample1-control-rule.yml”:
pre-rating-script:rules: - name: '获取每分钟交易次数' script: | var count = sip.getMetric("metric-sample1-1","count",request.account); log.info("[rules]每分钟交易次数: {}",count); return count; - name: '获取每分钟交易金额累计' script: | var amount = sip.getMetric("metric-sample1-1","amount",request.account); log.info("[rules]每分钟交易金额: {}",amount); return amount; - name: '获取每分钟交易对手数量' script: | var count = sip.getMetric("metric-sample1-2","zset-count",request.account); log.info("[rules]每分钟交易对手数量: {}",count); return count;rating-script: | control.message = ""; if (rules[0].result > 3) { control.action = "error"; control.message = control.message + "每分钟交易次数超过3次:" + rules[0].result + ","; } if (rules[1].result > 1000) { control.action = "error"; control.message = control.message + "每分钟交易金额超过1000元:" + rules[1].result + ","; } if (rules[2].result > 2) { control.action = "error"; control.message = control.message + "每分钟交易对手数量超过2个:" + rules[2].result + ","; } return;updating-script: | sip.addRecord("metric-sample1-1",request.account,request.amount); sip.addRecord("metric-sample1-2",request.account,request.other_account); return;
分别配置了评价前处理脚本(为空)、执行规则脚本、评价脚本、评价后更新脚本。
三、启动应用进行测试
启动SampleAppApplication应用,通过开放平台接口发起请求,进行一系列的测试。
1、针对“每分钟交易次数超过3次”的风控规则测试
首先,连续在一分钟内连接执行以下请求:
$ curl -H "Content-Type:application/json" -H "Biz-Service-Id:/bean/sample1-control-rule" -X POST --data '{"account":"001","amount":100,"other_account":"002"}' http://localhost:8888/api|jq{"code": 0,"message": "success","extMessage": null,"appServiceId": "/bean/sample1-control-rule","traceId": "88a648f8fd3a4701a250e206e31c08cb","parentTraceId": null,"timestamp": 1649060116207,"data": {"amount": 100,"other_account": "002","account": "001"}}
在60秒内第4次执行,会出现风控规则校验不通过的错误:
$ curl -H "Content-Type:application/json" -H "Biz-Service-Id:/bean/sample1-control-rule" -X POST --data '{"account":"001","amount":100,"other_account":"002"}' http://localhost:8888/api|jq{"code": 501,"message": "风控规则检查不通过","extMessage": "每分钟交易次数超过3次:4,","appServiceId": "/bean/sample1-control-rule","traceId": "a78178519e5e4761bd2de3293a78a86c","parentTraceId": null,"timestamp": 1649060120530,"data": null}
2、针对“每分钟交易金额超过1000元”的风控规则测试
首先,连续在一分钟内连接执行以下请求:
$ curl -H "Content-Type:application/json" -H "Biz-Service-Id:/bean/sample1-control-rule" -X POST --data '{"account":"001","amount":500,"other_account":"002"}' http://localhost:8888/api|jq{"code": 0,"message": "success","extMessage": null,"appServiceId": "/bean/sample1-control-rule","traceId": "09b20bf20882459084ca156fc9652373","parentTraceId": null,"timestamp": 1649060560647,"data": {"amount": 500,"other_account": "002","account": "001"}}
在60秒内第4次执行,会出现风控规则校验不通过的错误:
$ curl -H "Content-Type:application/json" -H "Biz-Service-Id:/bean/sample1-control-rule" -X POST --data '{"account":"001","amount":500,"other_account":"002"}' http://localhost:8888/api|jq{"code": 501,"message": "风控规则检查不通过","extMessage": "每分钟交易金额超过1000元:1500,","appServiceId": "/bean/sample1-control-rule","traceId": "10fd1a0f07b64def8f7d69267aaa222c","parentTraceId": null,"timestamp": 1649060563862,"data": null}
3、针对“每分钟交易对手数量超过2个”的风控规则测试
首先,连续在一分钟内连接执行以下请求,其中”other_account“分别填写不同的值:
$ curl -H "Content-Type:application/json" -H "Biz-Service-Id:/bean/sample1-control-rule" -X POST --data '{"account":"001","amount":500,"other_account":"002"}' http://localhost:8888/api|jq{"code": 0,"message": "success","extMessage": null,"appServiceId": "/bean/sample1-control-rule","traceId": "18bbd4fb9c8e405195375190094728d0","parentTraceId": null,"timestamp": 1649060818309,"data": {"amount": 500,"other_account": "002","account": "001"}}
在60秒内第4次执行,会出现风控规则校验不通过的错误:
$ curl -H "Content-Type:application/json" -H "Biz-Service-Id:/bean/sample1-control-rule" -X POST --data '{"account":"001","amount":500,"other_account":"005"}' http://localhost:8888/api|jq{"code": 501,"message": "风控规则检查不通过","extMessage": "每分钟交易金额超过1000元:1500,每分钟交易对手数量超过2个:3,","appServiceId": "/bean/sample1-control-rule","traceId": "a9423171d06947c09d555756e614405a","parentTraceId": null,"timestamp": 1649060831138,"data": null}
Biz-SIP网站:http://bizsip.bizmda.com
Gitee代码库:https://gitee.com/szhengye/biz-sip
版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除