好问题 👍 阿杰,你问的是 QLExpress(Quick Logic Express),这是一个国产的 Java 动态脚本引擎,在金融、电商、风控、推荐等系统里用得比较多。下面我给你系统讲解:
🚀 动态脚本引擎 QLExpress 详解
1. QLExpress 是什么?
QLExpress(Quick Logic Express)是阿里开源的一款 轻量级脚本引擎,用来在 Java 程序中动态执行逻辑脚本。
📌 它的主要特点:
- 语法接近 Java(学习成本低)。
- 可配置、安全沙箱(限制不安全操作)。
- 支持自定义函数、操作符、宏命令。
- 动态执行:无需重新编译 Java 代码。
👉 一句话:把业务逻辑交给脚本,让规则可以热更新,而不是改代码、发版。
2. 为什么需要 QLExpress?
在复杂业务中(比如风控规则、推荐算法、营销活动),逻辑经常变化,如果全部写死在 Java 里:
- 每次改规则都要改代码 + 部署 → 代价大、效率低。
- 运营人员无法直接修改规则。
引入 QLExpress 后:
- 规则用脚本写,存数据库或配置中心。
- Java 调用引擎运行脚本 → 动态执行逻辑。
- 不需要重新发版,灵活性高。
3. QLExpress 基本用法
3.1 引入依赖
Maven:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>QLExpress</artifactId>
<version>3.3.1</version>
</dependency>
3.2 Hello World
import com.ql.util.express.ExpressRunner;
public class Demo {
public static void main(String[] args) throws Exception {
ExpressRunner runner = new ExpressRunner();
String express = "1+2*3";
Object result = runner.execute(express, null, null, true, false);
System.out.println(result); // 输出 7
}
}
4. 常用功能
4.1 变量传递
Map<String, Object> context = new HashMap<>();
context.put("a", 10);
context.put("b", 5);
String express = "a + b * 2";
Object result = runner.execute(express, context, null, true, false);
System.out.println(result); // 20
4.2 自定义函数
runner.addFunction("max", new Operator() {
@Override
public Object executeInner(Object[] list) {
return Math.max((Integer) list[0], (Integer) list[1]);
}
});
String express = "max(3,8)";
Object result = runner.execute(express, null, null, true, false);
System.out.println(result); // 8
4.3 自定义操作符
runner.addOperator("add", new Operator() {
@Override
public Object executeInner(Object[] list) {
return (Integer) list[0] + (Integer) list[1];
}
});
String express = "5 add 10";
System.out.println(runner.execute(express, null, null, true, false)); // 15
4.4 控制流
QLExpress 支持类 Java 的 if、for、while:
String express =
"sum = 0;" +
"for(i=0;i<5;i++){" +
" sum = sum + i;" +
"}" +
"return sum;";
System.out.println(runner.execute(express, null, null, true, false)); // 10
5. QLExpress 在业务中的应用
- 风控引擎:
规则写成脚本,比如if (amount > 10000 && userLevel < 3) return false;
- 推荐系统:
动态权重计算,例如score = click*0.6 + like*0.4;
- 活动引擎:
配置优惠规则if (orderAmount > 200) return discount=20;
这样,运营人员只改脚本,不需要程序员重新发版。
6. QLExpress 优缺点
✅ 优点:
- 学习成本低(语法接近 Java)。
- 动态性强,可热更新规则。
- 支持函数、操作符扩展。
⚠️ 缺点:
- 性能比直接写 Java 稍差(但能接受)。
- 脚本过于复杂时可读性差。
- 安全需要注意(要限制危险方法调用)。
7. 与其他脚本引擎对比
- Groovy:功能强大,适合 DSL,但学习成本高。
- MVEL:轻量但社区弱。
- JSR-223(内置 JavaScript 引擎 Nashorn):通用,但性能一般。
- QLExpress:国产 + 简单 + 快速上手,特别适合规则引擎。
✨ 总结:
QLExpress 是 Java 项目中快速实现动态规则的利器,非常适合风控、活动、推荐场景。你只要在 Java 中调用引擎,业务逻辑就可以完全写在脚本里,后期调整非常灵活。
好 👌 阿杰,那我就给你写一个 电商优惠规则引擎 Demo(基于 QLExpress),让你直观感受它在真实业务场景中的用法。
🛒 电商优惠规则引擎 Demo
1. 场景设定
- 用户下单时,系统要根据 优惠规则 动态计算优惠金额。
- 规则可能是:
- 满减:满 200 减 20
- VIP 用户额外 10% 折扣
- 节日活动:满 500 减 100
👉 这些逻辑可能经常改,不想每次都重新发版,所以放在 QLExpress 脚本里。
2. Maven 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>QLExpress</artifactId>
<version>3.3.1</version>
</dependency>
3. Java 代码示例
import com.ql.util.express.ExpressRunner;
import java.util.HashMap;
import java.util.Map;
public class DiscountEngineDemo {
public static void main(String[] args) throws Exception {
ExpressRunner runner = new ExpressRunner();
// 模拟上下文:订单金额、用户等级、节日标识
Map<String, Object> context = new HashMap<>();
context.put("orderAmount", 520.0);
context.put("userLevel", 2); // 1=普通用户, 2=VIP
context.put("isFestival", true);
// 定义规则脚本(可存数据库/配置中心)
String ruleScript =
"discount = 0;" +
"if (orderAmount >= 200) { discount = discount + 20; }" +
"if (userLevel == 2) { discount = discount + orderAmount * 0.1; }" +
"if (isFestival && orderAmount >= 500) { discount = discount + 100; }" +
"return discount;";
// 执行规则
Object discount = runner.execute(ruleScript, context, null, true, false);
System.out.println("订单原价: " + context.get("orderAmount"));
System.out.println("优惠金额: " + discount);
System.out.println("支付金额: " + ((Double) context.get("orderAmount") - (Double) discount));
}
}
4. 运行结果示例
假设订单金额 520,用户等级 VIP(2),节日活动:
订单原价: 520.0
优惠金额: 172.0
支付金额: 348.0
计算过程:
- 满 200 减 20 → -20
- VIP 用户 10% → -52
- 节日满 500 减 100 → -100
- 合计优惠 172
5. 优化点
- 规则热更新:脚本存数据库,运营人员改完直接生效。
- 脚本管理:可配合后台界面编辑。
- 安全控制:通过
runner.addWhiteClass
/addWhiteMethod
限制能调用的类和方法。
✨ 这样,你就能把复杂的优惠规则交给 QLExpress 脚本来处理,业务逻辑可配置、灵活、低耦合。
好 👌 阿杰,那我帮你把 单条优惠规则 Demo 升级成一个 支持多条规则组合执行的优惠规则引擎框架。这样你就能像真正的“规则引擎”一样管理和运行多条规则。
🛒 电商优惠规则引擎(支持多条规则)
1. 场景设定
- 电商优惠活动可能有很多条规则:
- 满 200 减 20
- VIP 用户 10% 折扣
- 节日满 500 减 100
- 新用户下单立减 50
- 一个订单可能需要跑 多条规则,然后把优惠结果汇总。
2. 核心设计思路
- 每条规则都是一段 QLExpress 脚本。
- 所有规则存放在一个
List<String>
或数据库里。 - 遍历执行所有规则 → 汇总优惠金额。
3. Java 实现代码
import com.ql.util.express.ExpressRunner;
import java.util.*;
public class MultiRuleDiscountEngine {
private final ExpressRunner runner;
public MultiRuleDiscountEngine() {
this.runner = new ExpressRunner();
}
/**
* 执行多条规则,汇总优惠金额
*/
public double calculateDiscount(Map<String, Object> context, List<String> rules) throws Exception {
double totalDiscount = 0;
for (String rule : rules) {
Object result = runner.execute(rule, context, null, true, false);
if (result instanceof Number) {
totalDiscount += ((Number) result).doubleValue();
}
}
return totalDiscount;
}
public static void main(String[] args) throws Exception {
MultiRuleDiscountEngine engine = new MultiRuleDiscountEngine();
// 模拟订单上下文
Map<String, Object> context = new HashMap<>();
context.put("orderAmount", 520.0);
context.put("userLevel", 2); // 1=普通用户, 2=VIP
context.put("isFestival", true);
context.put("isNewUser", true);
// 定义多条规则(可以存数据库)
List<String> rules = Arrays.asList(
// 满减
"if (orderAmount >= 200) return 20; else return 0;",
// VIP 折扣
"if (userLevel == 2) return orderAmount * 0.1; else return 0;",
// 节日活动
"if (isFestival && orderAmount >= 500) return 100; else return 0;",
// 新用户优惠
"if (isNewUser) return 50; else return 0;"
);
// 执行规则引擎
double discount = engine.calculateDiscount(context, rules);
double payAmount = (Double) context.get("orderAmount") - discount;
// 输出结果
System.out.println("订单原价: " + context.get("orderAmount"));
System.out.println("优惠金额: " + discount);
System.out.println("支付金额: " + payAmount);
}
}
4. 运行结果示例
订单原价: 520.0
优惠金额: 222.0
支付金额: 298.0
计算过程:
- 满 200 减 20 → -20
- VIP 10% 折扣 (520*0.1=52) → -52
- 节日满 500 减 100 → -100
- 新用户立减 50 → -50
- 合计优惠 222
5. 可扩展方向
- 规则持久化:把
rules
存到数据库,运营人员可在后台配置。 - 规则分组:支持不同活动类型(满减 / 折扣 / 优惠券)。
- 规则优先级:给规则加权重或优先级,避免冲突。
- 规则调试:提供一个“沙箱模式”来单独跑规则。
✨ 现在你已经有一个 支持多条规则动态组合执行 的优惠规则引擎了,可以灵活应对电商活动。
发表回复