> 技术文档 > 使用 QLExpress 构建灵活可扩展的业务规则引擎

使用 QLExpress 构建灵活可扩展的业务规则引擎

目录

一、什么是 QLExpress?

二、推荐系统中的规则脚本应用

1 场景描述

2 推荐规则脚本(QLExpress)

3 系统实现

4 执行结果

5 推荐系统应用建议

三、风控系统中的规则判定

1 场景描述

2 风控规则脚本(QLExpress)

3 系统实现

4 执行结果

5 风控系统应用建议

四、设计建议


在大型系统中,规则引擎的存在使业务逻辑从代码中解耦出来,使得系统具备更高的灵活性与可维护性。阿里巴巴开源的 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 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 tags;        int activityScore;        boolean isNewUser;        UserProfile(int age, List 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 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 会是非常值得引入的工具。


参考资料:https://github.com/alibaba/QLExpress

github:https://github.com/alibaba/QLExpress