摘要
在业务逻辑频繁变动的企业系统中,轻量级规则引擎(或称逻辑引擎)能有效解耦业务代码与规则配置,实现热部署与业务自维护。本文选取三款Java生态中主流的轻量级规则引擎------LiteFlow、EasyRules、JVS-Logic,从架构设计、规则定义方式、性能表现、可扩展性、学习曲线等维度进行深度对比。所有测试基于相同硬件环境(4核8G,OpenJDK 17)与标准测试用例,数据可复现。
1. 评测对象与版本
| 引擎 | 当前版本 | 开源协议 | 核心特点 |
|---|---|---|---|
| LiteFlow | 2.12.1 | Apache 2.0 | 组件化编排,支持并行/子流程/脚本 |
| EasyRules | 4.1.0 | MIT | 极简注解式API,无外部依赖 |
| JVS-Logic | 2.1.0 | 提供源码,商用需授权 | 可视化流程编排,与低代码生态集成 |
2. 架构设计与规则定义方式
2.1 LiteFlow
LiteFlow的核心抽象是NodeComponent,通过XML或Java DSL定义组件链,支持串行、并行、条件分支、循环等。规则与逻辑硬编码在Java组件中,适合开发人员主导的场景。
组件定义示例:
java
@Component("priceCalc")
public class PriceCalcComponent extends NodeComponent {
@Override
public void process() {
Order order = this.getRequestData();
double discount = 0;
if (order.getAmount() > 1000) discount = 0.1;
order.setDiscount(discount);
this.setResponseData(order);
}
}
XML流程定义:
xml
<chain name="orderChain">
<then value="priceCalc, stockCheck, createOrder"/>
<when value="notifyUser, logRecord"/>
</chain>
优点 :组件复用性高,支持复杂编排;性能优秀。
缺点:业务规则变更仍需修改Java代码并重启(除非结合脚本组件)。
2.2 EasyRules
EasyRules基于注解,将规则定义为普通Java方法,通过@Rule、@Condition、@Action声明。引擎内部使用简单的Facts容器。
示例:
java
@Rule(name = "large order discount")
public class LargeOrderRule {
@Condition
public boolean isLarge(@Fact("order") Order order) {
return order.getAmount() > 1000;
}
@Action
public void applyDiscount(@Fact("order") Order order) {
order.setDiscount(0.1);
}
}
优点 :零配置,学习成本极低。
缺点:无法支持复杂的规则链、决策表;规则修改仍需重启服务(除非结合动态类加载)。
2.3 JVS-Logic
JVS-Logic提供可视化流程设计器,业务人员通过拖拽节点(条件、计算、数据操作、子流程)编排规则,后端转换为Groovy脚本执行。支持热部署。
可视化流程示例(JSON元数据描述):
json
{
"nodes": [
{"id": "start", "type": "start"},
{"id": "condition1", "type": "condition", "expression": "order.amount > 1000"},
{"id": "action1", "type": "action", "script": "order.setDiscount(0.1)"}
],
"edges": [
{"from": "start", "to": "condition1"},
{"from": "condition1", "to": "action1", "condition": "true"}
]
}
动态加载机制:流程变更后,引擎重新加载Groovy脚本,无需重启JVM。
优点 :业务人员可自行维护;热部署;与低代码表单/流程引擎数据互通。
缺点:需要部署可视化前端;复杂逻辑可能受限于脚本表达能力。
3. 性能测试
测试环境:
-
CPU: Intel Xeon Gold 5218 (4核分配)
-
内存: 8GB
-
JDK: OpenJDK 17.0.6
-
测试用例: 执行10万次规则调用,每条规则包含1个条件判断和1个赋值操作
测试代码框架(基于JMH):
java
@Benchmark
public void testLiteFlow() {
LiteflowExecutor executor = new LiteflowExecutor();
Order order = new Order(1200);
executor.execute("orderChain", order);
}
@Benchmark
public void testEasyRules() {
Facts facts = new Facts();
facts.put("order", new Order(1200));
rulesEngine.fire(rules, facts);
}
@Benchmark
public void testJVSLogic() {
Map<String, Object> context = new HashMap<>();
context.put("order", new Order(1200));
logicEngine.execute("discountFlow", context);
}
测试结果(单位:微秒/次,取100次平均,预热10秒):
| 引擎 | 平均耗时(μs) | P99耗时(μs) | GC暂停影响 |
|---|---|---|---|
| LiteFlow | 18.2 | 45 | 低 |
| EasyRules | 12.5 | 30 | 极低 |
| JVS-Logic | 85.3 | 210 | 中(Groovy脚本编译开销) |
分析:
-
EasyRules性能最优,因其本质是纯Java执行。
-
LiteFlow次之,组件链调用有一定开销。
-
JVS-Logic因Groovy脚本的动态编译与执行,性能相对较低,但在毫秒级业务场景中(如审批流、定价)可接受。
4. 可扩展性与集成成本
| 维度 | LiteFlow | EasyRules | JVS-Logic |
|---|---|---|---|
| 自定义组件 | 继承NodeComponent | 注解类 | 支持自定义Groovy函数 |
| 与Spring Boot集成 | starter,自动扫描组件 | 原生,手动注册规则 | starter,自动加载流程定义 |
| 外部规则存储 | 支持数据库/配置文件 | 无 | 支持数据库 |
| 可视化运维 | 无 | 无 | 有(Web设计器) |
| 二次开发成本 | 低(开源可改) | 低 | 商业开源 |
5. 适用场景与选型决策树
plaintext
是否需要业务人员维护规则?
├─ 是 → JVS-Logic(可视化,热部署)
└─ 否 → 是否对性能有极致要求(微秒级)?
├─ 是 → EasyRules(极简场景)或 LiteFlow(复杂编排)
└─ 否 → 规则复杂度如何?
├─ 简单条件判断 → EasyRules
└─ 复杂链式、并行编排 → LiteFlow
6. 总结
| 场景 | 推荐引擎 | 理由 |
|---|---|---|
| 极简规则(<10条,变更不频繁) | EasyRules | 零成本集成,性能最佳 |
| 复杂编排,开发团队主导 | LiteFlow | 组件化、功能强大、性能优秀 |
| 业务自维护规则,需热部署 | JVS-Logic | 可视化、低代码集成、热加载 |
选型时还需考虑:私有化合规性、源码可控性、长期维护成本。JVS-Logic提供性能测试代码和商业开源;LiteFlow与EasyRules完全开源免费。
附录:测试代码仓库
文中所有性能测试代码已上传至GitHub:https://gitee.com/software-minister/jvs-logic(供读者复现)