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

打印 上一主题 下一主题

主题 546|帖子 546|积分 1638

   一、规则引擎简述

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 依靠
  1. <dependencies>  
  2.     <!-- Drools Core -->  
  3.     <dependency>  
  4.         <groupId>org.kie</groupId>  
  5.         <artifactId>kie-api</artifactId>  
  6.         <version>7.59.0.Final</version>  
  7.     </dependency>  
  8.     <dependency>  
  9.         <groupId>org.kie</groupId>  
  10.         <artifactId>kie-ci</artifactId>  
  11.         <version>7.59.0.Final</version>  
  12.     </dependency>  
  13.     <!-- Drools Compiler -->  
  14.     <dependency>  
  15.         <groupId>org.drools</groupId>  
  16.         <artifactId>drools-core</artifactId>  
  17.         <version>7.59.0.Final</version>  
  18.     </dependency>  
  19.     <dependency>  
  20.         <groupId>org.drools</groupId>  
  21.         <artifactId>drools-compiler</artifactId>  
  22.         <version>7.59.0.Final</version>  
  23.     </dependency>  
  24. </dependencies>
复制代码


  • 创建 Drools 规则文件

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

  1. 1. 文件:src/main/resources/META-INF/kmodule.xml
  2. 定义了一个名为 rules的KBase。packages="*" 表示这个 KBase 将从所有可用的包中加载规则文件到这个 KBase 中。KBase(Knowledge Base) 是 Drools 中用于组织和管理规则集的一个容器。
  3. 在 rules KBase 下定义了一个名为 ksession-rules 的 Knowledge Session(KSession)。KSession 是 Drools 中用于执行规则集的一个环境。它允许你将数据(称为“事实”)插入到工作内存中,并触发规则的执行
  4. <kmodule xmlns="http://www.drools.org/xsd/kmodule">  
  5.     <kbase name="rules" packages="*">  
  6.         <ksession name="ksession-rules"/>  
  7.     </kbase>  
  8. </kmodule>
  9. 2. 文件:src/main/resources/xxx.drl
  10. package com.example.rules  
  11.   
  12. import com.example.Person  
  13.   
  14. rule "Is of age"  
  15.     when  
  16.         $p : Person(age >= 18)  
  17.     then  
  18.         System.out.println($p.getName() + " is of age.");  
  19. end
复制代码



  • 创建 java实体类
  1. package com.example;  
  2.   
  3. public class Person {  
  4.     private String name;  
  5.     private int age;  
  6.   
  7.     // Constructors, getters, and setters  
  8.     public Person(String name, int age) {  
  9.         this.name = name;  
  10.         this.age = age;  
  11.     }  
  12.   
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.   
  17.     public int getAge() {  
  18.         return age;  
  19.     }  
  20. }
复制代码


  • 测试
  1. import org.kie.api.KieServices;  
  2. import org.kie.api.runtime.KieContainer;  
  3. import org.kie.api.runtime.KieSession;  
  4.   
  5. public class DroolsTest {  
  6.     public static void main(String[] args) {  
  7.         // 加载并获取 KieServices, KieContainer, 和 KieSession  
  8.         KieServices ks = KieServices.Factory.get();  
  9.         KieContainer kContainer = ks.getKieClasspathContainer();  
  10.         KieSession kSession = kContainer.newKieSession("ksession-rules");  
  11.   
  12.         // 创建并插入事实  
  13.         Person person = new Person("John Doe", 20);  
  14.         kSession.insert(person);  
  15.   
  16.         // 执行(所有)规则  
  17.         kSession.fireAllRules();  
  18.   
  19.         // 关闭会话  
  20.         kSession.dispose();  
  21.     }  
  22. }
复制代码

2. Aviator

基本信息


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


  • 语法简便,易于学习和使用。
  • 性能优越,支持ASM模式直接将脚本翻译成JVM字节码。
  • 扩展性强,可以方便地调用Java方法和库。
使用案例:
        Aviator适用于各种必要动态表达式求值的场景,如公式计算、数据处置处罚转换、工作流逻辑判断、规则判断及规则引擎等。


  •  添加 Aviator 依靠
  1. <dependency>  
  2.     <groupId>com.googlecode.aviator</groupId>  
  3.     <artifactId>aviator</artifactId>  
  4.     <version>xxx</version>  
  5. </dependency>
复制代码


  • Aviator demo
  1. import com.googlecode.aviator.AviatorEvaluator;  
  2. import java.util.HashMap;  
  3. import java.util.Map;  
  4.   
  5. public class AviatorVariableExample {  
  6.     public static void main(String[] args) {  
  7.         Map<String, Object> env = new HashMap<>();  
  8.         env.put("a", 10);  
  9.         env.put("b", 20);  
  10.          
  11.         Long result = (Long) AviatorEvaluator.execute("a + b", env);  
  12.         System.out.println(result); // 输出: 30  
  13.         
  14.         // Aviator内置了许多函数,如数学函数、字符串函数等,你可以直接在表达式中调用它们
  15.         Long result = (Long) AviatorEvaluator.execute("math.round(3.14)");  
  16.         System.out.println(result); // 输出: 3  
  17.         String strResult = (String) AviatorEvaluator.execute("string.toUpperCase('hello')");  
  18.         System.out.println(strResult); // 输出: HELLO   
  19.         // 为了提高性能,Aviator允许你编译表达式,然后可以反复执行编译后的表达式
  20.         Expression expression = AviatorEvaluator.compile("2 * (3 + 5)");  
  21.         Long result = (Long) expression.execute();  
  22.         System.out.println(result); // 输出: 16      
  23.     }  
  24. }
复制代码

3. QLExpress

基本信息


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


  • 编译过程轻量化和机动。
  • 运行时通过threadLocal包管线程安全。
  • 脚本编译效果可缓存,提升实行效率。
使用案例


  •  添加QLExpress依靠
  1. <dependency>  
  2.     <groupId>com.alibaba</groupId>  
  3.     <artifactId>QLExpress</artifactId>  
  4.     <version>xxx</version>  
  5. </dependency>
复制代码


  • 使用案例
  1. import com.ql.util.express.DefaultContext;  
  2. import com.ql.util.express.ExpressRunner;  
  3. public class PromotionCalculator {  
  4.     public double calculatePromotedPrice(String promotionRule, double price) {  
  5.         ExpressRunner runner = new ExpressRunner();  
  6.         DefaultContext<String, Object> context = new DefaultContext<>();  
  7.         context.put("price", price);  
  8.         // 假设discount是从促销活动或用户信息中获取的,这里简化为硬编码  
  9.         context.put("discount", 0.8); // 示例:8折优惠  
  10.         try {  
  11.             Object result = runner.execute(promotionRule, context, null, true, false);  
  12.             return Double.parseDouble(result.toString());  
  13.         } catch (Exception e) {  
  14.             e.printStackTrace();  
  15.             return price; // 如果执行规则出错,则返回原价  
  16.         }  
  17.     }  
  18.     // 根据动态的促销规则计算商品促销后的价格
  19.     public static void main(String[] args) {  
  20.         PromotionCalculator calculator = new PromotionCalculator();  
  21.         double price = 150.0; // 商品原价  
  22.         String promotionRule = "price * discount"; // 促销规则  
  23.         double promotedPrice = calculator.calculatePromotedPrice(promotionRule, price);  
  24.         System.out.println("促销后价格:" + promotedPrice);  
  25.     }  
  26. }
复制代码

4. EasyRules

基本信息


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


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

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


  • 类型:开源规则引擎
  • 语言:Java
  • 特点:URule是一个功能全面的规则引擎,通过界面配置实现规则管理。它可能支持多种业务场景下的规则界说和实行,提供了机动的配置选项和强大的规则管理本领。
  • 应用场景:适用于必要复杂规则管理和配置的应用场景。
优势(基于通用理解):


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表