规则引擎选型及应用

简介: 规则引擎具体执行可以分为接受数据输入,解释业务规则,根据业务规则做出业务决策几个过程。 使用规则引擎可以把复杂、冗余的业务规则同整个支撑系统分离开,做到架构的可复用移植。

规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。
规则引擎具体执行可以分为接受数据输入,解释业务规则,根据业务规则做出业务决策几个过程。
使用规则引擎可以把复杂、冗余的业务规则同整个支撑系统分离开,做到架构的可复用移植。

规则引擎的应用

相对于业务系统,规则引擎可以认为是一个独立于业务系统的模块,负责一些规则的计算等。
一般来说,规则引擎主要应用在下面的场景中:

  • 风控模型配置,风控是规则引擎
  • 用户积分等配置,如日常操作引起积分变化等
  • 简单的离线计算,各类数据量比较小的统计等

常用规则引擎的选型

目前的规则引擎系统中,使用较多的开源规则引擎是Drools,另外还有商用的规则管理系统BRMS是ILOG JRules。

Drools

Drools是一个基于Java的开源规则引擎,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。

目前版本是5.0.1,Drools从5.0后分为四个模块:

  • Drools Guvnor (BRMS/BPMS)
  • Drools Expert (rule engine)
  • Drools Flow (process/workflow)
  • Drools Fusion (cep/temporal reasoning)

drools代码地址

[drools应用文档](https://github.com/kiegroup/droolsjbpm-build-bootstrap/blob/master/README.md
)

Ilog JRules

Ilog Jrules是完整的业务规则管理系统(BRMS),它提供了对整个企业业务规则进行建模、编写、测试、部署和维护所必需的所有工具。

Ilog Jrules主要包括以下4个组件:

  • Rule Studio(RS) 面向开发人员使用的开发环境,用于规则的建模和编写
  • Rule Scenario Manager 规则测试工具
  • Rule Team Server(RTS) 基于Web的管理环境,面向业务人员使用,用于规则发布、管理、存储
  • Rule Execution Server(RES) 面向运维人员使用,用于规则执行、监控

[Ilog Jrules主页](https://www-01.ibm.com/software/integration/business-rule-management/jrules-family/
)

这两款规则引擎设计和实现都比较复杂,学习成本高,适用于大型应用系统。

Easy Rules

Easy Rules是我偶然间看到的一个规则引擎实现,相比Drools等企业级规则引擎,Easy Rules的应用非常简单,学习成本低,容易上手。
下面重点介绍这款轻量级的规则引擎 Easy Rules。

轻量级规则引擎Easy Rules

Easy Rules官方主页:http://www.easyrules.org/

Easy Rules提供以下功能:

  • 轻量级框架和易于学习的API
  • 基于POJO的开发
  • 通过高效的抽象来定义业务规则并轻松应用它们
  • 支持创建复合规则

Easy Rules的应用

Easy rules的工程可以从Github下载,构建需要Maven支持。

$ git clone https://github.com/EasyRules/easyrules.git
$ cd easyrules
$ mvn install

Easy Rules打包后是一个单独的jar,使用时需要添加相关文件到工程中,或者添加Maven依赖:

<dependency>
    <groupId>org.easyrules</groupId>
    <artifactId>easyrules-core</artifactId>
    <version>2.4.0</version>
</dependency>

配置你的业务规则

大多数业务规则可以表示为以下定义:

  • 名称:一种唯一的规则名称
  • 描述:对规则的简要描述
  • 优先级:相对于其他规则的优先级
  • 条件:设置规则执行时需要满足的条件
  • 操作:设置的条件满足时执行的操作

我们可以通过扩展Easy Rules提供的Rule interface来定义规则,或者通过注解,定义自己的规则类。

下面是内置的Rule接口:

package org.easyrules.api;

public interface Rule {

    /**
    * 这个方法定义了规则执行的条件
    * @return true if the rule should be applied, false else
    */
    boolean evaluate();

    /**
    * 这个方法定义了规则执行的具体动作
    * @throws Exception if an error occurs
    */
    void execute() throws Exception;

    //Getters and setters for rule name,
    //description and priority omitted.

}

创建规则引擎

Easy Rules的引擎实例会维护一个不同规则的注册空间,每个Engine可以被视为一个单独的名称空间。
多条规则将会按照他们的自然顺序去执行,也就是默认的优先级。

要创建一个规则引擎和注册规则,可以使用下面的静态方法:

RulesEngineBuilder.aNewEngineBuilder():
RulesEngine rulesEngine = aNewEngineBuilder().build();
rulesEngine.registerRule(myRule);

执行下面的操作启动规则执行:

rulesEngine.fireRules();

Easy Rules应用实例

下面通过一个简单的Hello World示例来展示Easy Rules的具体应用。

通过注解创建一个具体的规则类:

@Rule(name = "Hello World rule",
    description = "Say Hello to duke's friends only")
public class HelloWorldRule {

    /**
     * The user input which represents the data
     * that the rule will operate on.
     */
    private String input;

    @Condition
    public boolean checkInput() {
        //The rule should be applied only if
        //the user's response is yes (duke friend)
        return input.equalsIgnoreCase("yes");
    }

    @Action
    public void sayHelloToDukeFriend() throws Exception {
        //When rule conditions are satisfied,
        //prints 'Hello duke's friend!' to the console
        System.out.println("Hello duke's friend!");
    }

    public void setInput(String input) {
        this.input = input;
    }

}

接下来创建一个规则引擎的实例,注册并且启动这个规则:


public class Launcher {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("Are you a friend of duke?[yes/no]:");
        String input = scanner.nextLine();

        /**
         * Declare the rule
         */
        HelloWorldRule helloWorldRule = new HelloWorldRule();

        /**
         * Set business data to operate on
         */
        helloWorldRule.setInput(input.trim());

        /**
         * Create a rules engine and register the business rule
         */
        RulesEngine rulesEngine = aNewRulesEngine().build();
        
        rulesEngine.registerRule(helloWorldRule);

        /**
         * Fire rules
         */
        rulesEngine.fireRules();

    }
}

规则启动后会通过一个简单的条件判断(控制台输入),然后执行接下来的动作(输出规则信息)。

除了规则引擎基础的规则执行功能, Easy Rules还支持监听规则执行情况,为规则执行配置调度器,
集成Spring等功能。

关于规则引擎的选型和简单应用就介绍到这里,除了风控等大型的应用系统,一些独立的小型产品需求中,可以合理应用规则引擎实现业务与规则的分离,降低系统间耦合,上面介绍的Easy Rules就是一个不错的选择。

目录
相关文章
|
存储 缓存 JavaScript
国内开源规则引擎牛起来
国内开源规则引擎牛起来
1651 0
|
运维 JavaScript Java
govaluate 规则引擎
govaluate 规则引擎
3621 0
govaluate 规则引擎
|
6月前
|
人工智能 供应链 数据可视化
一文读懂AI引擎与Together规则引擎重塑智能决策
从1950年图灵提出人工智能设想到如今AI引擎实现自主决策,Together规则引擎正成为智能决策核心。它通过动态规划、多工具调用与持续学习机制,赋能供应链、财务、定价等场景,提升决策透明度与效率。Together助力AI引擎突破落地瓶颈,推动企业管理迈向“决策即服务”新时代。
|
新零售 Java C++
java脚本引擎的设计原理浅析
本人在阿里巴巴长期担任和负责规则引擎、流程引擎相关的技术开发,另外还负责开发和维护开源项目:https://github.com/alibaba/QLExpress QLExpress是一个脚本引擎工具,类似Groovy,JRuby等,是为了解决当时电商规则动态编译、表达式高精度计算、复杂布尔运算、自定义函数和操作符号、语法树生成等需求而设计的。
16979 0
|
6月前
|
机器学习/深度学习 分布式计算 算法
规则引擎开发现在已经演化成算法引擎了
规则引擎是一种基于专家知识的程序,用于解决复杂决策问题。它通过条件与动作的匹配,实现自动化判断,广泛应用于金融、电商等领域。核心功能包括规则管理、推理算法(如Rete算法)及决策模型,如DMN标准,提升了建模能力与执行效率。
|
算法 Java JavaScript
规则引擎
我是阿里巴巴做规则引擎相关工作多年的java工程师一枚,本职工作就是通过规则引擎、规则管理平台等技术输出,来应对阿里巴巴复杂多变的上层规则相关业务的支持。限于技术保密、安全等因素,本文只讲一些个人对“规则引擎”的看法,欢迎大家一起探讨。
27028 1
|
存储 NoSQL 物联网
MongoDB应用场景
MongoDB应用场景
|
6月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1146 5
|
数据可视化 Java
探索Drools:Java世界的规则引擎
探索Drools:Java世界的规则引擎
1609 1
|
Java API
QLExpress功能清单
QLExpress从一开始就是从复杂的阿里电商业务系统出发,并且不断完善的脚本语言解析引擎框架,在不追求java语法的完整性的前提下(比如异常处理,foreach循环,lambda表达式,这些都是groovy是强项),定制了很多普遍存在的业务需求解决方案(比如变量解析,spring打通,函数封装,操作符定制,宏替换),同时在高性能、高并发、线程安全等方面也下足了功夫,久经考验。
22410 1