目录
在大型系统中,规则引擎的存在使业务逻辑从代码中解耦出来,使得系统具备更高的灵活性与可维护性。阿里巴巴开源的 QLExpress 正是一款轻量级、高性能、可扩展的 Java 表达式引擎,广泛应用于推荐、风控、营销等场景。
本文将围绕两个典型业务场景:推荐系统 与 风控系统,详细演示如何使用 QLExpress 构建脚本型规则体系,实现“可配置、可执行、可热更新”的规则逻辑管理。
一、什么是 QLExpress?
QLExpress 是阿里巴巴开源的规则引擎工具,核心目标是通过类 Java 的脚本语法实现业务规则的动态编写与执行,具备如下特性:
特性 | 说明 |
---|---|
轻量高性能 | 不依赖字节码增强或复杂 AST,内存占用小、性能优越 |
表达式能力强 | 支持 if , for , while , return 等控制结构 |
支持变量注入 | 可注入上下文对象、Java Bean、自定义函数 |
可运行时加载 | 可从数据库或配置中心动态加载脚本规则 |
安全可控 | 可配置沙箱环境,限制访问对象与方法 |
二、推荐系统中的规则脚本应用
1 场景描述
推荐系统通常需要基于用户画像、行为等动态特征生成推荐策略。以如下规则为例:
新用户 + 喜好“运动” → 推荐“运动入门课程”
活跃度高 → 推荐“高阶训练计划”
年龄小于 18 → 推荐“青少年专属内容”
这些规则变化频繁、迭代快速,采用脚本型规则管理更合适。
2 推荐规则脚本(QLExpress)
if (isNewUser && tags.contains("运动")) { return "推荐:运动入门课程"; } else if (activityScore > 80) { return "推荐:高阶训练计划"; } else if (age < 18) { return "推荐:青少年专属内容"; } else { return "推荐:通用内容"; }
3 系统实现
import com.ql.util.express.DefaultContext; import com.ql.util.express.ExpressRunner; import java.util.Arrays; import java.util.List; public class RecommendDemo { public static void main(String[] args) throws Exception { // 模拟用户画像 UserProfile user = new UserProfile(17, Arrays.asList("运动", "学习"), 60, true); // 上下文注入 DefaultContext<String, Object> context = new DefaultContext<>(); context.put("age", user.age); context.put("tags", user.tags); context.put("activityScore", user.activityScore); context.put("isNewUser", user.isNewUser); // 推荐规则脚本 String script = "" + "if (isNewUser && tags.contains(\"运动\")) {\n" + " return \"推荐:运动入门课程\";\n" + "} else if (activityScore > 80) {\n" + " return \"推荐:高阶训练计划\";\n" + "} else if (age < 18) {\n" + " return \"推荐:青少年专属内容\";\n" + "} else {\n" + " return \"推荐:通用内容\";\n" + "}"; Object result = new ExpressRunner().execute(script, context, null, true, false); System.out.println("推荐结果:" + result); } static class UserProfile { int age; List<String> tags; int activityScore; boolean isNewUser; UserProfile(int age, List<String> tags, int activityScore, boolean isNewUser) { this.age = age; this.tags = tags; this.activityScore = activityScore; this.isNewUser = isNewUser; } } }
4 执行结果
推荐结果:推荐:运动入门课程
5 推荐系统应用建议
后台配置推荐规则脚本,实时热更新;
按用户群体拆分规则(新用户/老用户);
日志记录命中规则,便于推荐效果分析。
三、风控系统中的规则判定
1 场景描述
风控系统中,我们需要实时评估用户风险。例如:
模拟器登录 → 拒绝
IP 与登录 IP 不一致 → 复审
短时间内频繁申请 → 复审
行为评分过低 → 拒绝
2 风控规则脚本(QLExpress)
if (deviceType == "模拟器") { return "REJECT:模拟器登录"; } else if (ip != loginIp) { return "REVIEW:IP地址异常"; } else if (applyCount > 5) { return "REVIEW:申请过于频繁"; } else if (behaviorScore < 60) { return "REJECT:行为评分过低"; } else { return "PASS"; }
3 系统实现
import com.ql.util.express.DefaultContext; import com.ql.util.express.ExpressRunner; public class RiskControlDemo { public static void main(String[] args) throws Exception { RiskContext user = new RiskContext("模拟器", "192.168.1.10", "192.168.1.10", 2, 85); DefaultContext<String, Object> context = new DefaultContext<>(); context.put("deviceType", user.deviceType); context.put("ip", user.ip); context.put("loginIp", user.loginIp); context.put("applyCount", user.applyCount); context.put("behaviorScore", user.behaviorScore); String script = "" + "if (deviceType == \"模拟器\") {\n" + " return \"REJECT:模拟器登录\";\n" + "} else if (ip != loginIp) {\n" + " return \"REVIEW:IP地址异常\";\n" + "} else if (applyCount > 5) {\n" + " return \"REVIEW:申请过于频繁\";\n" + "} else if (behaviorScore < 60) {\n" + " return \"REJECT:行为评分过低\";\n" + "} else {\n" + " return \"PASS\";\n" + "}"; Object result = new ExpressRunner().execute(script, context, null, true, false); System.out.println("风控结果:" + result); } static class RiskContext { String deviceType, ip, loginIp; int applyCount, behaviorScore; RiskContext(String deviceType, String ip, String loginIp, int applyCount, int behaviorScore) { this.deviceType = deviceType; this.ip = ip; this.loginIp = loginIp; this.applyCount = applyCount; this.behaviorScore = behaviorScore; } } }
4 执行结果
风控结果:REJECT:模拟器登录
5 风控系统应用建议
分维度组织规则(设备/IP/行为等);
返回结果分类(REJECT/REVIEW/PASS)做后续分流;
记录执行日志与规则命中路径;
配合数据库存储规则并热加载。
四、设计建议
QLExpress 提供了一种 灵活、轻量、高性能 的方式来处理复杂的业务规则:
推荐系统中:策略运营人员可通过脚本灵活配置推荐逻辑;
风控系统中:安全/风控策略团队可动态调整风险判断规则;
实现代码与规则解耦,提升系统响应与变更效率;
可通过规则脚本 + 数据注入快速构建业务中台能力。
如果你正在构建一个需要规则动态变更、逻辑可配置的系统,那么 QLExpress 会是非常值得引入的工具。