规则引擎Drools

规则引擎概述

规则引擎,全称为业务规则管理系统,英文名为 BRMS(即 Business Rule Management System)。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。
需要注意的是规则引擎并不是一个具体的技术框架,而是指的一类系统,即业务规则管理系统。目前市面上具体的规则引擎产品有:drools、VisualRules、iLog 等。
规则引擎实现了将业务决策从应用程序代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做出业务决策。规则引擎其实就是一个输入输出平台。

规则引擎优势

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

规则引擎常用场景

对于一些存在比较复杂的业务规则并且业务规则会频繁变动的系统比较适合使用规则引擎,如下:

  1. 风险控制系统—-风险贷款、风险评估
  2. 反欺诈项目—-银行贷款、征信验证
  3. 决策平台系统—-财务计算
  4. 促销平台系统—-满减、打折、加价购

Drools 实战

启动 Drools 的 WorkBench

docker pull jboss/drools-workbench-showcase:7.6.0.Final
docker run -p 8080:8080 -p 8001:8001 -d --name drools-workbench jboss/drools-workbench-showcase:7.6.0.Final

访问地址:http://ip:8080/drools-wb
账号密码:admin&admin

添加项目

添加数据对象



package com.myteam.presonrule;

rule "rule_person_1"
    when
        $person:Person(age<=6)
    then
        System.out.println("children");
end

rule "rule_person_2"
    when
        $person:Person(age>6 && age<=14)
    then
        System.out.println("early youth");
end

rule "rule_person_3"
    when
        $person:Person(age>14)
    then
        System.out.println("big children");
end



进入容器查看日志:

docker exec -it drools-workbench /bin/bash


设置 Session


在 springBoot 项目中引入坐标

<dependency>
  <groupId>org.drools</groupId>
  <artifactId>drools-compiler</artifactId>
  <version>7.10.0.Final</version>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
</dependency>

在项目中创建一个数据对象 Person,需要和 WorkBench 中创建的 Person 包名、类名完全相同,属性也需要对应

package com.myteam.presonrule;

/**
* This class was automatically generated by the data modeler tool.
*/

public class Person implements java.io.Serializable {

    static final long serialVersionUID = 1L;

    private java.lang.Long id;
    private java.lang.String name;
    private java.lang.Integer age;

    public Person() {
    }

    public java.lang.Long getId() {
        return this.id;
    }

    public void setId(java.lang.Long id) {
        this.id = id;
    }

    public java.lang.String getName() {
        return this.name;
    }

    public void setName(java.lang.String name) {
        this.name = name;
    }

    public java.lang.Integer getAge() {
        return this.age;
    }

    public void setAge(java.lang.Integer age) {
        this.age = age;
    }

    public Person(java.lang.Long id, java.lang.String name,
                  java.lang.Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

}

新建测试方法

package com.yjc.openholiday;

import com.myteam.presonrule.Person;
import org.drools.core.io.impl.UrlResource;
import org.junit.jupiter.api.Test;
import org.kie.api.KieServices;
import org.kie.api.builder.KieModule;
import org.kie.api.builder.KieRepository;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.InputStream;


@SpringBootTest
class OpenHolidayApplicationTests {


    @Test
    public void test1() throws Exception{
        //通过此URL可以访问到maven仓库中的jar包
        //URL地址构成:http://ip地址:Tomcat端口号/WorkBench工程名/maven2/坐标/版本号/xxx.jar
        //String url = "http://192.168.86.101:8080/kie-drools-wb/maven2/com/guohaowei/pro1/1.0.0/pro1-1.0.0.jar";
        String url ="http://139.224.64.206:8080/drools-wb/maven2/com/myteam/presonrule/1.0.0/presonrule-1.0.0.jar";

        KieServices kieServices = KieServices.Factory.get();

        //通过Resource资源对象加载jar包
        UrlResource resource = (UrlResource) kieServices.getResources().newUrlResource(url);
        //通过Workbench提供的服务来访问maven仓库中的jar包资源,需要先进行Workbench的认证
        resource.setUsername("admin");
        resource.setPassword("admin");
        resource.setBasicAuthentication("enabled");

        //将资源转换为输入流,通过此输入流可以读取jar包数据
        InputStream inputStream = resource.getInputStream();

        //创建仓库对象,仓库对象中保存Drools的规则信息
        KieRepository repository = kieServices.getRepository();

        //通过输入流读取maven仓库中的jar包数据,包装成KieModule模块添加到仓库中
        KieModule kieModule =
                repository.
                        addKieModule(kieServices.getResources().newInputStreamResource(inputStream));

        //基于KieModule模块创建容器对象,从容器中可以获取session会话
        KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());
        KieSession session = kieContainer.newKieSession();

        Person person = new Person();
        person.setAge(200);
        session.insert(person);

        session.fireAllRules();

        session.dispose();
    }

}

监控结果

代码位置
https://gitee.com/lovepaul/drools-person-demo.git


规则引擎Drools
http://example.com/2023/03/07/oxao8qyeporktgyl/
作者
杨靖成
发布于
2023年3月7日
许可协议