【Drools】规则引擎Drools(一)——简介+springboot结合Drools规则引擎Demo

一、前言

      前一段时间接触到了风控系统,因为风控的业务是负责多变的,所以在其中过程中,业务也不断的提出新的需求,比如:

☞规则优惠
提供面向不同客户细分维度、时间属性、业务种类进行群体性的优惠条件设定,根据优惠条件设定各自的优惠定价标准。
§ 支持多种优惠条件的定义(附例子)
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,但实际上却承担了将业务规则准确无误实现的重任。

扫描二维码关注公众号,回复: 2450007 查看本文章

      4) 系统僵化,新需求插入困难。

      5) 新需求上线周期较长。

规则引擎能帮助我们什么

      我们知道了,规则引擎就是为了解决复杂多变的业务,并且快速的数据计算。他可以把规则和核心业务拆开,规则单独配置。这样当我们的规则变化的时候,就可以通过修改规则文件而不用修改核心的代码了。

什么样的项目适合使用规则引擎

      规则引擎使用较为广泛,并不能说只适合某几个领域,应该说,在规则较为复杂的行业,都是适用的,如金融、制造、医疗、物流等行业,面临的规则变化较为复杂,目前使用较多。而且对规则引擎需求的行业也将越来越多,如团购平台、传统企业管理渠道等,都存在大量快速变化的业务规则,如何快速应对,已经成为挑战,谁能快速适应,谁就能一马当先。

规则引擎常有的框架有哪些

JBoss Drools

      Drools规则引擎介绍Drools是Jboss公司旗下一款开源的规则引擎,它完整的实现了Rete算法;提供了强大的EclipsePlugin开发支持;通过使用其中的DSL(DomainSpecificLanguage),可以实现用自然语言方式来描述业务规则,使得业务分析人员也可以看懂业务规则代码。最新版本Drools5提供了基于WEB的BRMS——Guvnor,Guvnor提供了规则管理的知识库,通过它可以实现规则的版本控制,及规则的在线修改与编译,使得开发人员和系统管理人员可以在线管理业务规则。
更多JBoss Drools信息

Mandarax

      Mandarax是一个规则引擎的纯Java实现。它支持多类型的事实和基于反映的规则,数据库,EJB等等,支持XML标准(RuleML 0.8)。它提供了一个兼容J2EE的使用反向链接的接口引擎。
更多Mandarax信息

JLisa

      JLisa是一个利用java构建商业规则的强大框架。它实现了JSR94 Rule Engine API。
更多JLisa信息

OpenRules

      OpenRules基于java完全开放源代码的商业规则管理框架。它有效的利用了MS Excel, Eclipse IDE 和其它java开源类库去构造,维护,部署,执行不同的复杂商业逻辑的规则引擎。
更多OpenRules信息

JEOPS

      JEOPS(The Java Embedded Object Production System)是一个基于Java的演绎法(Forward-Chaining)规则引擎.这个规则引擎被用于在Java 应用服务器,Java客户端程序,和Servlets中通过规则来提高它们的商业处理能力.
更多JEOPS信息

InfoSapient

      InfoSapient是一个开源的规则引擎.它设计用来表达,执行和维护在同一个公司中商业规则.InfoSapient基于纯Java开发,使用到MVC,Visitor,Strategy,Facade,Factory Method,Observer,Iterator等设计模式.

JRuleEngine

      JRuleEngine基于JSR94规范的java规则引擎。

Roolie

      Roolie是一个极其简单的Java规则引擎(Non-JSR94)它使用你在Java中创建的规则。 简单创建基本的规则,为每个规则实现单个”passes”方法,然后在一个XML文件中将它们链起来创建更复杂的规则。

三、SpringBoot结合Drools实现规则引擎

宏观说说Drools文件

这里写图片描述

搭建springboot框架,引入Drools依赖

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>

    <groupId>com.wl</groupId>
    <artifactId>drools</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>drools</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.14.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-decisiontables</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-templates</artifactId>
            <version>7.0.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>7.0.0.Final</version>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <configuration>
                    <executable>java</executable>
                    <arguments>
                        <argument>com.galaxyyao.springbootdroolstest1.SpringBootDroolsTest1Application</argument>
                    </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层

      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();
    }
}

Controller层:

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的资料非常少,只能在项目中一点一点实践,后面向大家介绍一下规则文件相关的东西。

猜你喜欢

转载自blog.csdn.net/kisscatforever/article/details/80784675