规则引擎介绍与使用:Drools、Aviator、QLExpress、EasyRules、URule

   一、规则引擎简述

1.1 什么是规则引擎

        规则引擎是一种嵌入在应用程序中的组件,它实现了将业务决策从应用程序代码中分离出来的功能,并使用预定义的语义模块来编写和执行这些业务决策。       

        规则引擎通常包括一个规则库,其中存储了以某种形式(如脚本、XML文件等)定义的业务规则。当应用程序需要做出决策时,它会将相关数据发送给规则引擎。规则引擎会遍历规则库中的规则,根据数据输入和规则的逻辑进行匹配和评估,最终产生决策结果并返回给应用程序。

1.2 规则引擎特点

  • 特点
    1. 业务与代码分离:规则引擎将业务规则与应用程序代码分离,使得业务规则的修改无需修改代码,降低了维护成本。
    2. 灵活性:支持动态修改规则,以适应业务变化的需求。
    3. 可重用性:规则可以跨多个应用程序和场景重复使用,提高了开发效率。
    4. 可视化设计:许多规则引擎提供了可视化设计器,允许非技术人员通过图形界面来定义和修改规则。
  • 优势
    1. 提高应用程序的灵活性:业务规则的变更不再需要修改和重新部署应用程序代码。
    2. 降低维护成本:业务人员和开发人员可以分工合作,业务人员负责规则的定义和修改,开发人员负责应用程序的开发和维护。
    3. 支持复杂业务逻辑:规则引擎可以处理复杂的业务逻辑和条件判断,提高决策的准确性和效率。

二、常用的规则引擎

Drools、Aviator、QLExpress、EasyRules、URule是五种不同的规则引擎,它们各自具有不同的特点和优势:

  • Drools:用Java语言编写的开源规则引擎,基于Rete算法实现,功能强大且易于集成到Java应用中。
  • Aviator:阿里开源的高性能、轻量级表达式求值引擎,支持运算符重载和多种数据类型。
  • QLExpress:由阿里电商业务驱动的动态脚本引擎解析工具,支持复杂的业务逻辑计算和表达式计算。
  • EasyRules:轻量级的Java规则引擎,提供简单而强大的API来定义和执行规则。
  • URule:一款功能全面的规则引擎,支持可视化配置和复杂的业务规则管理。

2.1 Drools

基本信息

  • 类型:开源业务规则引擎
  • 语言:Java
  • 特点:基于Charles Forgy的RETE算法,具有易于访问企业策略、易于调整以及易于管理的特点。Drools将业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或数据库中,便于业务规则的变更和管理。
  • 应用场景:广泛应用于企业级的业务规则管理和决策支持系统。

优势

  • 功能强大,支持复杂的业务规则表达和推理。
  • 易于与Java应用集成,适合企业级应用开发。
  • 社区活跃,有丰富的文档和案例可供参考。

使用案例

  • 添加Drools 依赖
<dependencies>  
    <!-- Drools Core -->  
    <dependency>  
        <groupId>org.kie</groupId>  
        <artifactId>kie-api</artifactId>  
        <version>7.59.0.Final</version>  
    </dependency>  
    <dependency>  
        <groupId>org.kie</groupId>  
        <artifactId>kie-ci</artifactId>  
        <version>7.59.0.Final</version>  
    </dependency>  
    <!-- Drools Compiler -->  
    <dependency>  
        <groupId>org.drools</groupId>  
        <artifactId>drools-core</artifactId>  
        <version>7.59.0.Final</version>  
    </dependency>  
    <dependency>  
        <groupId>org.drools</groupId>  
        <artifactId>drools-compiler</artifactId>  
        <version>7.59.0.Final</version>  
    </dependency>  
</dependencies>
  • 创建 Drools 规则文件

    • 在 src/main/resources/META-INF/kmodule.xml 中配置你的 KModule:

    • 在 src/main/resources/ 下创建一个新的目录 rules,并在其中添加你的 .drl 规则文件,例如 simple-rules.drl

1. 文件:src/main/resources/META-INF/kmodule.xml
先定义一个名为 rules的KBase。packages="*" 
表示这个 KBase 将从所有可用的包中加载规则文件到这个 KBase 中。

KBase(Knowledge Base) 是 Drools 中用于组织和管理规则集的一个容器。
在 rules KBase 下定义ksession-rules 的 Knowledge Session(KSession)。
KSession 是 Drools 中用于执行规则集的一个环境。
它允许你将数据(称为“事实”)插入到工作内存中,并触发规则的执行
<kmodule xmlns="http://www.drools.org/xsd/kmodule">  
    <kbase name="rules" packages="*">  
        <ksession name="ksession-rules"/>  
    </kbase>  
</kmodule>


2. 文件:src/main/resources/xxx.drl
package com.example.rules  
  
import com.example.Person  
  
rule "Is of age"  
    when  
        $p : Person(age >= 18)  
    then  
        System.out.println($p.getName() + " is of age.");  
end

  • 创建 java实体类

package com.example;  
  
public class Person {  
    private String name;  
    private int age;  
  
    // Constructors, getters, and setters  
    public Person(String name, int age) {  
        this.name = name;  
        this.age = age;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public int getAge() {  
        return age;  
    }  
}
  • 测试
import org.kie.api.KieServices;  
import org.kie.api.runtime.KieContainer;  
import org.kie.api.runtime.KieSession;  
  
public class DroolsTest {  
    public static void main(String[] args) {  
        // 加载并获取 KieServices, KieContainer, 和 KieSession  
        KieServices ks = KieServices.Factory.get();  
        KieContainer kContainer = ks.getKieClasspathContainer();  
        KieSession kSession = kContainer.newKieSession("ksession-rules");  
  
        // 创建并插入事实  
        Person person = new Person("John Doe", 20);  
        kSession.insert(person);  
  
        // 执行(所有)规则  
        kSession.fireAllRules();  
  
        // 关闭会话  
        kSession.dispose();  
    }  
}

2. Aviator

基本信息

  • 类型:轻量级脚本语言
  • 语言:基于JVM
  • 特点:Aviator是一门高性能、轻量级的脚本语言,专为Java平台设计。它支持数字、字符串、正则表达式、布尔值等基本类型,并且可以使用所有Java运算符进行运算。Aviator还提供了内置的bigint和decimal类型,用于处理超大整数和高精度运算。
  • 应用场景:适用于规则判断、公式计算、动态脚本控制等多种场景。

优势

  • 语法简洁,易于学习和使用。
  • 性能优越,支持ASM模式直接将脚本翻译成JVM字节码。
  • 扩展性强,可以方便地调用Java方法和库。

使用案例:

        Aviator适用于各种需要动态表达式求值的场景,如公式计算、数据处理转换、工作流逻辑判定、规则判断及规则引擎等。

  •  添加 Aviator 依赖
<dependency>  
    <groupId>com.googlecode.aviator</groupId>  
    <artifactId>aviator</artifactId>  
    <version>xxx</version>  
</dependency>
  • Aviator demo

import com.googlecode.aviator.AviatorEvaluator;  
import java.util.HashMap;  
import java.util.Map;  
  
public class AviatorVariableExample {  
    public static void main(String[] args) {  
        Map<String, Object> env = new HashMap<>();  
        env.put("a", 10);  
        env.put("b", 20);  
          
        Long result = (Long) AviatorEvaluator.execute("a + b", env);  
        System.out.println(result); // 输出: 30  
        
        // Aviator内置了许多函数,如数学函数、字符串函数等,你可以直接在表达式中调用它们
        Long result = (Long) AviatorEvaluator.execute("math.round(3.14)");  
        System.out.println(result); // 输出: 3  
        String strResult = (String) AviatorEvaluator.execute("string.toUpperCase('hello')");  
        System.out.println(strResult); // 输出: HELLO   

        // 为了提高性能,Aviator允许你编译表达式,然后可以反复执行编译后的表达式
        Expression expression = AviatorEvaluator.compile("2 * (3 + 5)");  
        Long result = (Long) expression.execute();  
        System.out.println(result); // 输出: 16      
    }  
}

3. QLExpress

基本信息

  • 类型:弱类型脚本语言
  • 语言:基于JVM
  • 特点:QLExpress是一个轻量级的规则引擎,支持弱类型脚本语言。它具有线程安全、高效执行、安全控制等特点。QLExpress的脚本编译过程可以缓存在本地机器,提高了执行效率。
  • 应用场景:广泛应用于电商业务场景,支持复杂的业务逻辑判断和表达式计算。

优势

  • 编译过程轻量化和灵活。
  • 运行时通过threadLocal保证线程安全。
  • 脚本编译结果可缓存,提升执行效率。

使用案例

  •  添加QLExpress依赖
<dependency>  
    <groupId>com.alibaba</groupId>  
    <artifactId>QLExpress</artifactId>  
    <version>xxx</version>  
</dependency>
  • 使用案例

import com.ql.util.express.DefaultContext;  
import com.ql.util.express.ExpressRunner;  

public class PromotionCalculator {  

    public double calculatePromotedPrice(String promotionRule, double price) {  
        ExpressRunner runner = new ExpressRunner();  
        DefaultContext<String, Object> context = new DefaultContext<>();  
        context.put("price", price);  

        // 假设discount是从促销活动或用户信息中获取的,这里简化为硬编码  
        context.put("discount", 0.8); // 示例:8折优惠  

        try {  
            Object result = runner.execute(promotionRule, context, null, true, false);  
            return Double.parseDouble(result.toString());  
        } catch (Exception e) {  
            e.printStackTrace();  
            return price; // 如果执行规则出错,则返回原价  
        }  
    }  

    // 根据动态的促销规则计算商品促销后的价格
    public static void main(String[] args) {  
        PromotionCalculator calculator = new PromotionCalculator();  
        double price = 150.0; // 商品原价  
        String promotionRule = "price * discount"; // 促销规则  
        double promotedPrice = calculator.calculatePromotedPrice(promotionRule, price);  
        System.out.println("促销后价格:" + promotedPrice);  
    }  
}

4. EasyRules

基本信息

  • 类型:轻量级Java规则引擎
  • 语言:Java
  • 特点:EasyRules是一个简单而强大的Java规则引擎,提供了轻量级框架和易于学习的API。它基于POJO的开发与注解的编程模型,支持从简单规则创建组合规则的能力。
  • 应用场景:适用于需要简单规则管理和执行的应用场景。

优势

  • 易于学习和使用。
  • 支持组合规则和表达式语言。
  • 基于注解的编程模型降低了开发难度。

5. URule

基本信息(由于信息较少,以下部分基于通用理解和规则引擎的一般特点):

  • 类型:开源规则引擎
  • 语言:Java
  • 特点:URule是一个功能全面的规则引擎,通过界面配置实现规则管理。它可能支持多种业务场景下的规则定义和执行,提供了灵活的配置选项和强大的规则管理能力。
  • 应用场景:适用于需要复杂规则管理和配置的应用场景。

优势(基于通用理解):

  • 功能全面,支持复杂的规则配置和管理。
  • 界面友好,易于操作和维护。
  • 灵活性高,适应不同业务场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值