写点什么

这 5 种规则引擎,真香!

  • 2025-07-11
    福建
  • 本文字数:2625 字

    阅读完需:约 9 分钟

前言


核心痛点:业务规则高频变更与系统稳定性之间的矛盾

想象一个电商促销场景:

// 传统硬编码方式(噩梦开始...)public BigDecimal calculateDiscount(Order order) {    BigDecimal discount = BigDecimal.ZERO;        if (order.getTotalAmount().compareTo(new BigDecimal("100")) >= 0) {        discount = discount.add(new BigDecimal("10"));    }        if (order.getUser().isVip()) {        discount = discount.add(new BigDecimal("5"));    }        // 更多if-else嵌套...    return discount;}
复制代码


当规则变成:"非 VIP 用户满 200 减 30,VIP 用户满 150 减 40,且周二全场额外 95 折"时,代码将陷入维护地狱!

规则引擎通过分离规则逻辑解决这个问题:

  1. 规则外置存储(数据库/文件)

  2. 支持动态加载

  3. 声明式规则语法

  4. 独立执行环境

下面给大家分享 5 种常用的规则引擎,希望对你会有所帮助。


1.五大常用规则引擎


1.1 Drools:企业级规则引擎扛把子

官网https://www.drools.org/

适用场景:

  • 金融风控规则(上百条复杂规则)

  • 保险理赔计算

  • 电商促销体系

实战:折扣规则配置

// 规则文件 discount.drlrule "VIP用户满100减20"    when        $user: User(level == "VIP")        $order: Order(amount > 100)    then        $order.addDiscount(20);end
复制代码


Java 调用代码:

KieServices kieServices = KieServices.Factory.get();KieContainer kContainer = kieServices.getKieClasspathContainer();KieSession kSession = kContainer.newKieSession("discountSession");
kSession.insert(user);kSession.insert(order);kSession.fireAllRules();
复制代码


优点

  • 完整的 RETE 算法实现

  • 支持复杂的规则网络

  • 完善的监控管理控制台


缺点

  • 学习曲线陡峭

  • 内存消耗较大

  • 需要依赖 Kie 容器

适合:不差钱的大厂,规则复杂度高的场景


1.2 Easy Rules:轻量级规则引擎之王

官网https://github.com/j-easy/easy-rules

适用场景:

  • 参数校验

  • 简单风控规则

  • 审批流引擎

注解式开发:

@Rule(name = "雨天打折规则", description = "下雨天全场9折")public class RainDiscountRule {
@Condition public boolean when(@Fact("weather") String weather) { return "rainy".equals(weather); } @Action public void then(@Fact("order") Order order) { order.setDiscount(0.9); }}
复制代码


引擎执行:

RulesEngineParameters params = new RulesEngineParameters()    .skipOnFirstAppliedRule(true); // 匹配即停止
RulesEngine engine = new DefaultRulesEngine(params);engine.fire(rules, facts);
复制代码

优点

  • 五分钟上手

  • 零第三方依赖

  • 支持规则组合


缺点

  • 不支持复杂规则链

  • 缺少可视化界面

适合:中小项目快速落地,开发人员不足时


1.3 QLExpress:阿里系脚本引擎之光

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

适用场景:

  • 动态配置计算逻辑

  • 财务公式计算

  • 营销规则灵活变更

执行动态脚本:

ExpressRunner runner = new ExpressRunner();DefaultContext<String, Object> context = new DefaultContext<>();context.put("user", user);context.put("order", order);
String express = "if (user.level == 'VIP') { order.discount = 0.85; }";runner.execute(express, context, null, true, false);
复制代码


高级特性:

// 1. 函数扩展runner.addFunction("计算税费", new Operator() {    @Override    public Object execute(Object[] list) {        return (Double)list[0] * 0.06;    }});
// 2. 宏定义runner.addMacro("是否新用户", "user.regDays < 30");
复制代码

优点

  • 脚本热更新

  • 语法接近 Java

  • 完善的沙箱安全


缺点

  • 调试困难

  • 复杂规则可读性差

适合:需要频繁修改规则的业务(如运营活动)


1.4 Aviator:高性能表达式专家

官网https://github.com/killme2008/aviatorscript

适用场景:

  • 实时定价引擎

  • 风控指标计算

  • 大数据字段加工

性能对比(执行 10 万次):

// Aviator 表达式Expression exp = AviatorEvaluator.compile("user.age > 18 && order.amount > 100");exp.execute(map);
// Groovy 脚本new GroovyShell().evaluate("user.age > 18 && order.amount > 100");
复制代码



编译优化:

// 开启编译缓存(默认开启)AviatorEvaluator.getInstance().useLRUExpressionCache(1000);
// 字节码生成模式(JDK8+)AviatorEvaluator.setOption(Options.ASM, true);
复制代码


优点

  • 性能碾压同类引擎

  • 支持字节码生成

  • 轻量无依赖


缺点

  • 只支持表达式

  • 不支持流程控制

适合:对性能有极致要求的计算场景


1.5 LiteFlow:规则编排新物种

官网:https://liteflow.com/

适用场景:

  • 复杂业务流程

  • 订单状态机

  • 审核工作流

编排示例:

<chain name="orderProcess">    <then value="checkStock,checkCredit"/> <!-- 并行执行 -->    <when value="isVipUser">         <then value="vipDiscount"/>     </when>    <otherwise>        <then value="normalDiscount"/>    </otherwise>    <then value="saveOrder"/></chain>
复制代码


Java 调用:

LiteflowResponse response = FlowExecutor.execute2Resp("orderProcess", order, User.class);if (response.isSuccess()) {    System.out.println("流程执行成功");} else {    System.out.println("失败原因:" + response.getCause());}
复制代码


优点

  • 可视化流程编排

  • 支持异步、并行、条件分支

  • 热更新规则


缺点

  • 新框架文档较少

  • 社区生态待完善

适合:需要灵活编排的复杂业务流


2 五大规则引擎横向评测



性能压测数据(单机 1 万次执行):



3 如何技术选型?



黄金法则:

  1. 简单场景:EasyRules + Aviator 组合拳

  2. 金融风控:Drools 稳如老狗

  3. 电商运营:QLExpress 灵活应变

  4. 工作流驱动:LiteFlow 未来可期

4 避坑指南


1、Drools 内存溢出

// 设置无状态会话(避免内存积累)KieSession session = kContainer.newStatelessKieSession();
复制代码


2、QLExpress 安全漏洞

// 禁用危险方法runner.addFunctionOfServiceMethod("exit", System.class, "exit", null, null);
复制代码


3、规则冲突检测

// Drools冲突处理策略KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();config.setProperty("drools.sequential", "true"); // 按顺序执行
复制代码


总结

  1. 能用:替换 if/else(新手村)

  2. 用好:规则热更新+可视化(进阶)

  3. 用精:规则编排+性能优化(大师级)


文章转载自:苏三说技术

原文链接:https://www.cnblogs.com/12lisu/p/18939721

体验地址:http://www.jnpfsoft.com/?from=001YH


用户头像

还未添加个人签名 2025-04-01 加入

还未添加个人简介

评论

发布
暂无评论
这5种规则引擎,真香!_前端_电子尖叫食人鱼_InfoQ写作社区