一、规则引擎简述
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是一个功能全面的规则引擎,通过界面配置实现规则管理。它可能支持多种业务场景下的规则定义和执行,提供了灵活的配置选项和强大的规则管理能力。
- 应用场景:适用于需要复杂规则管理和配置的应用场景。
优势(基于通用理解):
- 功能全面,支持复杂的规则配置和管理。
- 界面友好,易于操作和维护。
- 灵活性高,适应不同业务场景的需求。