文章目录

  • 1 规则引擎概述
  • 1.1什么是规则引擎
  • 1.2规则引擎的优势
  • 1.3规则引擎的适用场景
  • 1.4相关概念
  • 2 Drools
  • 2.1介绍
  • 2.2构成
  • 2.3使用
  • 2.4API开发步骤


用传统方式编写规则的缺点:

  • 难以维护
  • 难以应对规则变化
  • 修改代码后重启服务才能生效

1 规则引擎概述

1.1什么是规则引擎

  • 全称业务规则管理系统(BRMS)
  • 主要思想:将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。
  • 规则引擎不是框架,是一类系统,常见的规则引擎有drools、VisualRules、iLog等
  • 规则引擎实现了将业务从应用程序中分离出来,接受数据输入,解释业务规则,并根据业务规则作出业务决策。规则引擎实际就是一个输入输出平台。

1.2规则引擎的优势

  • 业务规则与系统代码分离,实现业务规则的集中管理
  • 在不重启服务的情况下可随时对业务规则进行扩展和维护
  • 可以动态修改业务规则,快速响应需求变更
  • 规则引擎是相对独立的,只关心业务规则,使得业务分析人员也可以参与编辑、维护系统的业务规则
  • 减少了硬编码业务规则的成本和风险
  • 使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单

1.3规则引擎的适用场景

存在比较复杂的业务规则并且业务规则会频繁变动的系统,如:风险控制系统(风险贷款、风险评估)、反欺诈项目(银行贷款、征信验证)、决策平台系统(财务计算)、促销平台系统(满减、打折、加价购)

1.4相关概念

  • Working Memory:工作内存,drools规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,所以开发的应用程序只需要将数据插入到Working Memory中即可,例如Drools入门案例中调用kieSession.insert(order)就是将order对象插入到了工作内存中。
  • Fact:事实,是指在drools 规则应用当中,将一个普通的JavaBean插入到Working Memory后的对象就是Fact对象,例如Drools入门案例中的Order对象就属于Fact对象。Fact对象是应用和规则引擎进行数据交互的桥梁或通道。
  • Rule Base:规则库,在规则文件中定义的规则都会被加载到规则库中。
  • Pattern Matcher:匹配器,将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入Agenda中。
  • Agenda:议程,用于存放通过匹配器进行模式匹配后被激活的规则。
  • Execution Engine:执行引擎,执行Agenda中被激活的规则。

2 Drools

2.1介绍

由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(如数据库),使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效。

drools官网地址:https://drools.org/

drools源码下载地址:https://github.com/kiegroup/drools

2.2构成

drools规则引擎由以下三部分构成:

  • Working Memory(工作内存)
  • Rule Base(规则库)
  • Inference Engine(推理引擎)

其中Inference Engine(推理引擎)又包括:

  • Pattern Matcher(匹配器):把事实对象和规则相匹配
  • Agenda(议程):存放匹配成功将要执行的规则
  • Execution Engine(执行引擎)

2.3使用

  1. 单独使用:导入以下maven坐标即可
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>7.6.0.Final</version>
</dependency>

如果使用IDEA开发drools应用,IDEA中已经集成了drools插件。如果使用eclipse开发drools应用还需要单独安装drools插件。

  1. 整合spring使用

2.4API开发步骤

获取KieServices–>获取KieContainer–>KieSession–>Insert fact–>触发规则–>关闭KieSession