第2-4-1章 规则引擎Drools介绍-业务规则管理系统-组件化-中台
规则引擎 Drools
1. 问题引出
现有一个在线申请信用卡的业务场景,用户需要录入个人信息,如下图所示:
通过上图可以看到,用户录入的个人信息包括姓名、性别、年龄、学历、电话、所在公司、职位、月收入、是否有房、是否有车、是否有信用卡等。录入完成后点击申请按钮提交即可。
用户提交申请后,需要在系统的服务端进行用户信息合法性检查(是否有资格申请信用卡),只有通过合法性检查的用户才可以成功申请到信用卡(注意:不同用户有可能申请到的信用卡额度不同)。
检查用户信息合法性的规则如下:
规则编号 | 名称 | 描述 |
---|---|---|
1 | 检查学历与薪水1 | 如果申请人既没房也没车,同时学历为大专以下,并且月薪少于5000,那么不通过 |
2 | 检查学历与薪水2 | 如果申请人既没房也没车,同时学历为大专或本科,并且月薪少于3000,那么不通过 |
3 | 检查学历与薪水3 | 如果申请人既没房也没车,同时学历为本科以上,并且月薪少于2000,同时之前没有信用卡的,那么不通过 |
4 | 检查申请人已有的信用卡数量 | 如果申请人现有的信用卡数量大于10,那么不通过 |
用户信息合法性检查通过后,还需要根据如下信用卡发放规则确定用户所办信用卡的额度:
规则编号 | 名称 | 描述 |
---|---|---|
1 | 规则1 | 如果申请人有房有车,或者月收入在20000以上,那么发放的信用卡额度为15000 |
2 | 规则2 | 如果申请人没房没车,但月收入在10000~20000之间,那么发放的信用卡额度为6000 |
3 | 规则3 | 如果申请人没房没车,月收入在10000以下,那么发放的信用卡额度为3000 |
4 | 规则4 | 如果申请人有房没车或者没房但有车,月收入在10000以下,那么发放的信用卡额度为5000 |
5 | 规则5 | 如果申请人有房没车或者是没房但有车,月收入在10000~20000之间,那么发放的信用卡额度为8000 |
思考:如何实现上面的业务逻辑呢?
我们最容易想到的就是使用分支判断(if else)来实现,例如通过如下代码来检查用户信息合法性:
//此处为伪代码
//检查用户信息合法性,返回true表示检查通过,返回false表示检查不通过
public boolean checkUser(User user){
//如果申请人既没房也没车,同时学历为大专以下,并且月薪少于5000,那么不通过
if(user.getHouse() == null
&& user.getcar() == null
&& user.getEducation().equals("大专以下")
&& user.getSalary < 5000){
return false;
}
//如果申请人既没房也没车,同时学历为大专或本科,并且月薪少于3000,那么不通过
else if(user.getHouse() == null
&& user.getcar() == null
&& user.getEducation().equals("大专或本科")
&& user.getSalary < 3000){
return false;
}
//如果申请人既没房也没车,同时学历为本科以上,并且月薪少于2000,同时之前没有信用卡的,那么不通过
else if(user.getHouse() == null
&& user.getcar() == null
&& user.getEducation().equals("本科以上")
&& user.getSalary < 2000
&& user.getHasCreditCard() == false){
return false;
}
//如果申请人现有的信用卡数量大于10,那么不通过
else if(user.getCreditCardCount() > 10){
return false;
}
return true;
}
如果用户信息合法性检查通过后,还需要通过如下代码确定用户所办信用卡的额度:
//此处为伪代码
//根据用户输入信息确定信用卡额度
public Integer determineCreditCardLimit(User user){
//如果申请人有房有车,或者月收入在20000以上,那么发放的信用卡额度为15000
if((user.getHouse() != null && user.getcar() != null)
|| user.getSalary() > 20000){
return 15000;
}
//如果申请人没房没车,并且月收入在10000到20000之间,那么发放的信用卡额度为6000
else if(user.getHouse() == null
&& user.getcar() == null
&& user.getSalary() > 10000
&& user.getSalary() < 20000){
return 6000;
}
//如果申请人没房没车,并且月收入在10000以下,那么发放的信用卡额度为3000
else if(user.getHouse() == null
&& user.getcar() == null
&& user.getSalary() < 10000){
return 3000;
}
//如果申请人有房没车或者没房但有车,并且月收入在10000以下,那么发放的信用卡额度为5000
else if((((user.getHouse() != null && user.getcar() == null) || (user.getHouse() == null && user.getcar() != null))
&& user.getSalary() < 10000){
return 5000;
}
//如果申请人有房没车或者没房但有车,并且月收入在10000到20000之间,那么发放的信用卡额度为8000
else if((((user.getHouse() != null && user.getcar() == null) || (user.getHouse() == null && user.getcar() != null))
&& (user.getSalary() > 10000 && user.getSalary() < 20000)){
return 8000;
}
}
通过上面的伪代码我们可以看到,我们的业务规则是通过Java代码的方式实现的。这种实现方式存在如下问题:
1、硬编码实现业务规则难以维护
2、硬编码实现业务规则难以应对变化
3、业务规则发生变化需要修改代码,重启服务后才能生效
那么面对上面的业务场景,还有什么好的实现方式吗?
答案是规则引擎。
2. 规则引擎概述
2.1 什么是规则引擎
规则引擎,全称为业务规则管理系统,英文名为BRMS(即Business Rule Management System)。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。
需要注意的是规则引擎并不是一个具体的技术框架,而是指的一类系统,即业务规则管理系统。目前市面上具体的规则引擎产品有:drools、VisualRules、iLog等。
规则引擎实现了将业务决策从应用程序代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做出业务决策。规则引擎其实就是一个输入输出平台。
上面的申请信用卡业务场景使用规则引擎后效果如下:
系统中引入规则引擎后,业务规则不再以程序代码的形式驻留在系统中,取而代之的是处理规则的规则引擎,业务规则存储在规则库中,完全独立于程序。业务人员可以像管理数据一样对业务规则进行管理,比如查询、添加、更新、统计、提交业务规则等。业务规则被加载到规则引擎中供应用系统调用。
2.2 使用规则引擎的优势
使用规则引擎的优势如下:
1、业务规则与系统代码分离,实现业务规则的集中管理
2、在不重启服务的情况下可随时对业务规则进行扩展和维护
3、可以动态修改业务规则,从而快速响应需求变更
4、规则引擎是相对独立的,只关心业务规则,使得业务分析人员也可以参与编辑、维护系统的业务规则
5、减少了硬编码业务规则的成本和风险
6、使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单
2.3 规则引擎应用场景
对于一些存在比较复杂的业务规则并且业务规则会频繁变动的系统比较适合使用规则引擎,如下:
1、风险控制系统----风险贷款、风险评估
2、反欺诈项目----银行贷款、征信验证
3、决策平台系统----财务计算
4、促销平台系统----满减、打折、加价购
2.4 Drools介绍
drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效。
drools官网地址:https://drools.org/
drools源码下载地址:https://github.com/kiegroup/drools
在项目中使用drools时,即可以单独使用也可以整合spring使用。如果单独使用只需要导入如下maven坐标即可:
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.6.0.Final</version>
</dependency>
如果我们使用IDEA开发drools应用,IDEA中已经集成了drools插件。如果使用eclipse开发drools应用还需要单独安装drools插件。
drools API开发步骤如下:
第2-4-1章 规则引擎Drools介绍-业务规则管理系统-组件化-中台的更多相关文章
- 规则引擎drools封装
一.前言 网上规则引擎drools介绍很多,并且有很多细致的说明,作者也不敢托大说自己的好用,但作者经过2个项目使用过规则引擎后,自己对规则引擎的理解并进行封装,对规则内容及如何使用,有自己的一番实践 ...
- JAVA规则引擎 -- Drools
Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...
- 小明历险记:规则引擎drools教程一
小明是一家互联网公司的软件工程师,他们公司为了吸引新用户经常会搞活动,小明常常为了做活动加班加点很烦躁,这不今天呀又来了一个活动需求,我们大家一起帮他看看. 小明的烦恼 活动规则是根据用户购买订单的金 ...
- 开源规则引擎 drools
java语言开发的开源业务规则引擎 DROOLS(JBOSS RULES )具有一个易于访问企业策略.易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快.效率高.业务分析师或审核人员可以利用 ...
- 开源规则引擎 Drools 学习笔记 之 -- 1 cannot be cast to org.drools.compiler.kie.builder.impl.InternalKieModule
直接进入正题 我们在使用开源规则引擎 Drools 的时候, 启动的时候可能会抛出如下异常: Caused by: java.lang.ClassCastException: cn.com.cheng ...
- SNF快速开发平台--规则引擎整体介绍及使用说明书
一.设计目标 a)规则引擎语法能够满足分单,计费,WMS策略的配置要求.语法是一致和统一的 b)能够在不修改规则引擎模块的情况下,加入任意一个新的规则:实现上述需求之外的规则配置需求 c)运算速度快 ...
- [Drools]JAVA规则引擎 -- Drools 2
上一篇文章 http://blog.csdn.net/quzishen/archive/2011/01/25/6163012.aspx 描述了一些常用的drools的语法标签和一个模拟实例即发送积分的 ...
- 使用规则引擎Drools计算圆周率PI
实际上是使用规则引擎能够更新工作内存区重新匹配规则实现迭代功能. 使用了策略模式实现. <规则引擎与RETE算法介绍> PPT : http://files.cnblogs.com/lov ...
- [Drools]JAVA规则引擎 -- Drools
Drools是一个基于Java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...
- 规则引擎 drools
https://www.jianshu.com/p/725811f420db 深入了解Drools 简单介绍 笔者正在做风控系统,风控系统里边存在非常多的规则(比如:age < 16 || ag ...
随机推荐
- 【Android 逆向】switch 的smail特征
JAVA 源码 ... String str1 = packedSwitch(1); ... private String packedSwitch(int i) { String str = nul ...
- logstash接受checkpoint防火墙日志并用ruby分词
直接上logstahs配置文件 input{ syslog{ type => "syslog" port => 514 } } filter { grok { matc ...
- 利用 Gitea Doctor自助诊断工具帮助管理员排查问题
我常常在Gitea论坛或者Hostea为网友解答Gitea版本升级方面的问题,但发现少有人知道利用 gitea doctor 命令行工具排查问题,因此这篇博文将给大家带来通俗易懂的介绍. 你知道吗? ...
- 数仓Hive和分布式计算引擎Spark多整合方式实战和调优方向
@ 目录 概述 Spark on Hive Hive on Spark 概述 编译Spark源码 配置 调优思路 编程方向 分组聚合优化 join优化 数据倾斜 任务并行度 小文件合并 CBO 谓词下 ...
- Elasticsearch删除操作详解
文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484022&idx=1&sn=7a4de21 ...
- elk使用微信ElartAlert企业微信告警,自定义告警内容
第一种方式 alert: - "elastalert_modules.wechat_qiye_alert.WeChatAlerter" alert_text: " === ...
- C#-8 数组
一 关于数组 数组是由一个变量名称表示的一组同类型的数据元素.数组中的元素通过变量名和方括号索引来访问. int[] intArray = new int[] { 1, 2, 3 }; //声明了一个 ...
- liunx之expect简介
导航: 一.expect安装.介绍.使用场景二.expect使用原理三.expect使用语法四.expect使用举例五.expect相关错误处理 - - - - - - - - - 分割线 - - - ...
- Oracle导出和导入
导出 exp exp 用户名/密码@实例名 file=导出的dmp文件存放路径 l og=导出日志存放路径 exp hr/123456@orcl file= C:\Users\Administrato ...
- day03-2-拓展
满汉楼03 5.拓展_多表查询 前面都是对单表进行操作 思考一个问题:如果多表查询怎么处理?例如,查看账单时,希望现实菜品名称 查询的结果从上图变为下图: 方案一 由多张表组合查询的的结果,我们仍然可 ...