欢乐狗 发表于 2024-9-5 12:35:57

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

   一、规则引擎简述

1.1 什么是规则引擎

        规则引擎是一种嵌入在应用程序中的组件,它实现了将业务决议从应用程序代码中分离出来的功能,并使用预界说的语义模块来编写和实行这些业务决议。       
        规则引擎通常包罗一个规则库,其中存储了以某种形式(如脚本、XML文件等)界说的业务规则。当应用程序必要做出决议时,它会将相关数据发送给规则引擎。规则引擎会遍历规则库中的规则,根据数据输入和规则的逻辑举行匹配和评估,终极产生决议效果并返回给应用程序。

1.2 规则引擎特点



[*]特点:
[*]业务与代码分离:规则引擎将业务规则与应用程序代码分离,使得业务规则的修改无需修改代码,低落了维护本钱。
[*]机动性:支持动态修改规则,以适应业务变化的需求。
[*]可重用性:规则可以跨多个应用程序和场景重复使用,提高了开发效率。
[*]可视化筹划:许多规则引擎提供了可视化筹划器,答应非技能人员通过图形界面来界说和修改规则。

[*]优势:
[*]提高应用程序的机动性:业务规则的变更不再必要修改和重新部署应用程序代码。
[*]低落维护本钱:业务人员和开发人员可以分工互助,业务人员负责规则的界说和修改,开发人员负责应用程序的开发和维护。
[*]支持复杂业务逻辑:规则引擎可以处置处罚复杂的业务逻辑和条件判断,提高决议的正确性和效率。

二、常用的规则引擎

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是一个功能全面的规则引擎,通过界面配置实现规则管理。它可能支持多种业务场景下的规则界说和实行,提供了机动的配置选项和强大的规则管理本领。
[*]应用场景:适用于必要复杂规则管理和配置的应用场景。
优势(基于通用理解):


[*]功能全面,支持复杂的规则配置和管理。
[*]界面友好,易于操纵和维护。
[*]机动性高,适应差异业务场景的需求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 规则引擎介绍与使用:Drools、Aviator、QLExpress、EasyRules、URule