规则引擎介绍与使用: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]