前一段时间接触到了风控系统,因为风控的业务是负责多变的,所以在其中过程中,业务也不断的提出新的需求,比如:
☞规则优惠
提供面向不同客户细分维度、时间属性、业务种类进行群体性的优惠条件设定,根据优惠条件设定各自的优惠定价标准。
§ 支持多种优惠条件的定义(附例子)
o 员工标志 - 我是点融员工,P2P撮合手续全免了
o 年龄段 -营销活动,30-40岁之前的同学不收撮合手续费
o 星期 - 国庆黄金周,撮合手续费打5折
o 时间段 - 零点了,客官还在购买我行产品呀,给您免去快赎手续费
o 客户类型 - 军哥哥来投资,一律不准收任何手续费
o 客户群体 - 华东区所有的客户手续费全免
o 客户等级 -老子投了500w,早就是VIP了,撮合手续费免了吧
o 卡种 - 银联联名借记卡今天手续费全免
o 受理渠道 - XX渠道过来的客源免管理费
o 特殊事件 – 抱歉我行今天系统升级,期间所有交易可能受影响,手续费全免
o 职业 - 教师节,所有老师信用卡刷卡免手续费
o 产品种类 - 跨行转账今天不收费啦
o 员工级别 - 公司高管老总,你还敢收手续费?
§ 除了支持单一优惠条件的定义,还支持各优惠条件的组合定义。
§ 可以针对单一收费种类或收费事件定义优惠定价标准,即优惠档次,优惠类型,优惠金额/比率等。
业务列出了这么多条优惠条件,并且这些条件还不是固定的,有可能改其中的费用值,也有可能新增其他的约束规则。如果按照传统的if….else….写,绝对有很多,并且不灵活。
下面小编就向大家介绍一下,规则引擎。专门解决复杂多变的业务场景。
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。 From Baidu
解决复杂多变的业务逻辑,以及对复杂的数据进行快速计算。
1) 当业务规则变更时,对应的代码也得跟着更改,每次即使是小的变更都需要经历开发、测试验证上线等过程,变更成本比较大。
2) 长时间系统变得越来越难以维护。
3) 开发团队一般是由一个熟悉业务的BA(业务分析人员)和若干个熟悉技术的开发人员组成,开发人员对业务规则的把握能力远不及BA,但实际上却承担了将业务规则准确无误实现的重任。
4) 系统僵化,新需求插入困难。
5) 新需求上线周期较长。
我们知道了,规则引擎就是为了解决复杂多变的业务,并且快速的数据计算。他可以把规则和核心业务拆开,规则单独配置。这样当我们的规则变化的时候,就可以通过修改规则文件而不用修改核心的代码了。
规则引擎使用较为广泛,并不能说只适合某几个领域,应该说,在规则较为复杂的行业,都是适用的,如金融、制造、医疗、物流等行业,面临的规则变化较为复杂,目前使用较多。而且对规则引擎需求的行业也将越来越多,如团购平台、传统企业管理渠道等,都存在大量快速变化的业务规则,如何快速应对,已经成为挑战,谁能快速适应,谁就能一马当先。
Drools规则引擎介绍Drools是Jboss公司旗下一款开源的规则引擎,它完整的实现了Rete算法;提供了强大的EclipsePlugin开发支持;通过使用其中的DSL(DomainSpecificLanguage),可以实现用自然语言方式来描述业务规则,使得业务分析人员也可以看懂业务规则代码。最新版本Drools5提供了基于WEB的BRMS——Guvnor,Guvnor提供了规则管理的知识库,通过它可以实现规则的版本控制,及规则的在线修改与编译,使得开发人员和系统管理人员可以在线管理业务规则。
更多JBoss Drools信息
Mandarax是一个规则引擎的纯Java实现。它支持多类型的事实和基于反映的规则,数据库,EJB等等,支持XML标准(RuleML 0.8)。它提供了一个兼容J2EE的使用反向链接的接口引擎。
更多Mandarax信息
JLisa是一个利用java构建商业规则的强大框架。它实现了JSR94 Rule Engine API。
更多JLisa信息
OpenRules基于java完全开放源代码的商业规则管理框架。它有效的利用了MS Excel, Eclipse IDE 和其它java开源类库去构造,维护,部署,执行不同的复杂商业逻辑的规则引擎。
更多OpenRules信息
JEOPS(The Java Embedded Object Production System)是一个基于Java的演绎法(Forward-Chaining)规则引擎.这个规则引擎被用于在Java 应用服务器,Java客户端程序,和Servlets中通过规则来提高它们的商业处理能力.
更多JEOPS信息
InfoSapient是一个开源的规则引擎.它设计用来表达,执行和维护在同一个公司中商业规则.InfoSapient基于纯Java开发,使用到MVC,Visitor,Strategy,Facade,Factory Method,Observer,Iterator等设计模式.
JRuleEngine基于JSR94规范的java规则引擎。
Roolie是一个极其简单的Java规则引擎(Non-JSR94)它使用你在Java中创建的规则。 简单创建基本的规则,为每个规则实现单个”passes”方法,然后在一个XML文件中将它们链起来创建更复杂的规则。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.wlgroupId>
<artifactId>droolsartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>jarpackaging>
<name>droolsname>
<description>Demo project for Spring Bootdescription>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>1.5.14.RELEASEversion>
<relativePath/>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.droolsgroupId>
<artifactId>drools-coreartifactId>
<version>7.0.0.Finalversion>
dependency>
<dependency>
<groupId>org.droolsgroupId>
<artifactId>drools-compilerartifactId>
<version>7.0.0.Finalversion>
dependency>
<dependency>
<groupId>org.droolsgroupId>
<artifactId>drools-decisiontablesartifactId>
<version>7.0.0.Finalversion>
dependency>
<dependency>
<groupId>org.droolsgroupId>
<artifactId>drools-templatesartifactId>
<version>7.0.0.Finalversion>
dependency>
<dependency>
<groupId>org.kiegroupId>
<artifactId>kie-apiartifactId>
<version>7.0.0.Finalversion>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.16.20version>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>exec-maven-pluginartifactId>
<configuration>
<executable>javaexecutable>
<arguments>
<argument>com.galaxyyao.springbootdroolstest1.SpringBootDroolsTest1Applicationargument>
arguments>
configuration>
plugin>
plugins>
build>
project>
在src/main/resources下添加两个目录:
META-INF和rules
META-INF下添加kmodule.xml,内容如下:
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="ksession-rules"/>
kbase>
kmodule>
rules目录下添加一个简单的Hello World规则:
package com.galaxyyao.springbootdroolstest1
import com.wl.drools.domain.Message
dialect "mvel"
rule "Hello World"
dialect "mvel"
when
m : Message(status.equals(Message.HELLO), message : message )
then
System.out.println( message);
modify ( m ) { message = "Goodbye cruel world",status = Message.GOODBYE };
end
rule "Good Bye"
dialect "java"
when
Message( status == Message.GOODBYE, message : message )
then
System.out.println( message );
end
Domain层定义一个Drools中需要使用到的Model:
package com.wl.drools.domain;
import lombok.Data;
/**
* Created by Ares on 2018/6/23.
*/
@Data
public class Message {
public static final Integer HELLO = 0;
public static final Integer GOODBYE = 1;
private String message;
private Integer status;
}
Service层:
package com.wl.drools.service.impl;
import com.wl.drools.domain.Message;
import com.wl.drools.service.DroolsService;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.stereotype.Service;
/**
* Created by Ares on 2018/6/23.
*/
@Service("droolsService")
public class DroolsServiceImpl implements DroolsService {
public String fireRule() {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
// go !
Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
kSession.insert(message);//插入
kSession.fireAllRules();//执行规则
kSession.dispose();
return message.getMessage();
}
}
package com.wl.drools.controller;
import com.wl.drools.service.DroolsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by Ares on 2018/6/23.
*/
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private DroolsService droolsService;
@GetMapping("/showRults")
public String showRults(){
return droolsService.fireRule();
}
@GetMapping("/testBoot")
public String testBoot(){
return "123456";
}
}
通过访问http://localhost:8080/test/showRults,显示如下:
当我们的规则发生变化的时候,我们就修改规则文件,就可以了。
通过这次的学习,可以说,关于Drools的资料非常少,只能在项目中一点一点实践,后面向大家介绍一下规则文件相关的东西。