找回密码
 立即注册
首页 业界区 业界 这5种规则引擎,真香!

这5种规则引擎,真香!

迫蔺 2025-6-21 09:16:07
前言

核心痛点:业务规则高频变更与系统稳定性之间的矛盾
想象一个电商促销场景:
  1. // 传统硬编码方式(噩梦开始...)
  2. public BigDecimal calculateDiscount(Order order) {
  3.     BigDecimal discount = BigDecimal.ZERO;
  4.    
  5.     if (order.getTotalAmount().compareTo(new BigDecimal("100")) >= 0) {
  6.         discount = discount.add(new BigDecimal("10"));
  7.     }
  8.    
  9.     if (order.getUser().isVip()) {
  10.         discount = discount.add(new BigDecimal("5"));
  11.     }
  12.    
  13.     // 更多if-else嵌套...
  14.     return discount;
  15. }
复制代码
当规则变成:"非VIP用户满200减30,VIP用户满150减40,且周二全场额外95折"时,代码将陷入维护地狱!
规则引擎通过分离规则逻辑解决这个问题:

  • 规则外置存储(数据库/文件)
  • 支持动态加载
  • 声明式规则语法
  • 独立执行环境
下面给大家分享5种常用的规则引擎,希望对你会有所帮助。
1.五大常用规则引擎

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

官网:https://www.drools.org/
适用场景:


  • 金融风控规则(上百条复杂规则)
  • 保险理赔计算
  • 电商促销体系
实战:折扣规则配置
  1. // 规则文件 discount.drl
  2. rule "VIP用户满100减20"
  3.     when
  4.         $user: User(level == "VIP")
  5.         $order: Order(amount > 100)
  6.     then
  7.         $order.addDiscount(20);
  8. end
复制代码
Java调用代码:
  1. KieServices kieServices = KieServices.Factory.get();
  2. KieContainer kContainer = kieServices.getKieClasspathContainer();
  3. KieSession kSession = kContainer.newKieSession("discountSession");
  4. kSession.insert(user);
  5. kSession.insert(order);
  6. kSession.fireAllRules();
复制代码
优点

  • 完整的RETE算法实现
  • 支持复杂的规则网络
  • 完善的监控管理控制台
缺点

  • 学习曲线陡峭
  • 内存消耗较大
  • 需要依赖Kie容器
适合:不差钱的大厂,规则复杂度高的场景
1.2 Easy Rules:轻量级规则引擎之王

官网:https://github.com/j-easy/easy-rules
适用场景:


  • 参数校验
  • 简单风控规则
  • 审批流引擎
注解式开发:
  1. @Rule(name = "雨天打折规则", description = "下雨天全场9折")
  2. public class RainDiscountRule {
  3.     @Condition
  4.     public boolean when(@Fact("weather") String weather) {
  5.         return "rainy".equals(weather);
  6.     }
  7.    
  8.     @Action
  9.     public void then(@Fact("order") Order order) {
  10.         order.setDiscount(0.9);
  11.     }
  12. }
复制代码
引擎执行:
  1. RulesEngineParameters params = new RulesEngineParameters()
  2.     .skipOnFirstAppliedRule(true); // 匹配即停止
  3. RulesEngine engine = new DefaultRulesEngine(params);
  4. engine.fire(rules, facts);
复制代码
优点

  • 五分钟上手
  • 零第三方依赖
  • 支持规则组合
缺点

  • 不支持复杂规则链
  • 缺少可视化界面
适合:中小项目快速落地,开发人员不足时
1.3 QLExpress:阿里系脚本引擎之光

官网:https://github.com/alibaba/QLExpress
适用场景:


  • 动态配置计算逻辑
  • 财务公式计算
  • 营销规则灵活变更
执行动态脚本:
  1. ExpressRunner runner = new ExpressRunner();
  2. DefaultContext<String, Object> context = new DefaultContext<>();
  3. context.put("user", user);
  4. context.put("order", order);
  5. String express = "if (user.level == 'VIP') { order.discount = 0.85; }";
  6. runner.execute(express, context, null, true, false);
复制代码
高级特性:
  1. // 1. 函数扩展
  2. runner.addFunction("计算税费", new Operator() {
  3.     @Override
  4.     public Object execute(Object[] list) {
  5.         return (Double)list[0] * 0.06;
  6.     }
  7. });
  8. // 2. 宏定义
  9. runner.addMacro("是否新用户", "user.regDays < 30");
复制代码
优点

  • 脚本热更新
  • 语法接近Java
  • 完善的沙箱安全
缺点

  • 调试困难
  • 复杂规则可读性差
适合:需要频繁修改规则的业务(如运营活动)
1.4 Aviator:高性能表达式专家

官网:https://github.com/killme2008/aviatorscript
适用场景:


  • 实时定价引擎
  • 风控指标计算
  • 大数据字段加工
性能对比(执行10万次):
  1. // Aviator 表达式
  2. Expression exp = AviatorEvaluator.compile("user.age > 18 && order.amount > 100");
  3. exp.execute(map);
  4. // Groovy 脚本
  5. new GroovyShell().evaluate("user.age > 18 && order.amount > 100");
复制代码
引擎耗时Aviator220msGroovy1850ms编译优化:
  1. // 开启编译缓存(默认开启)
  2. AviatorEvaluator.getInstance().useLRUExpressionCache(1000);
  3. // 字节码生成模式(JDK8+)
  4. AviatorEvaluator.setOption(Options.ASM, true);
复制代码
优点

  • 性能碾压同类引擎
  • 支持字节码生成
  • 轻量无依赖
缺点

  • 只支持表达式
  • 不支持流程控制
适合:对性能有极致要求的计算场景
1.5 LiteFlow:规则编排新物种

官网:https://liteflow.com/
适用场景:


  • 复杂业务流程
  • 订单状态机
  • 审核工作流
编排示例:
  1. <chain name="orderProcess">
  2.     <then value="checkStock,checkCredit"/>
  3.     <when value="isVipUser">
  4.         <then value="vipDiscount"/>
  5.     </when>
  6.     <otherwise>
  7.         <then value="normalDiscount"/>
  8.     </otherwise>
  9.     <then value="saveOrder"/>
  10. </chain>
复制代码
Java调用:
  1. LiteflowResponse response = FlowExecutor.execute2Resp("orderProcess", order, User.class);
  2. if (response.isSuccess()) {
  3.     System.out.println("流程执行成功");
  4. } else {
  5.     System.out.println("失败原因:" + response.getCause());
  6. }
复制代码
优点

  • 可视化流程编排
  • 支持异步、并行、条件分支
  • 热更新规则
缺点

  • 新框架文档较少
  • 社区生态待完善
适合:需要灵活编排的复杂业务流
2 五大规则引擎横向评测

1.png

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

引擎耗时内存占用特点Drools420ms高功能全面Easy Rules38ms低轻量易用QLExpress65ms中阿里系脚本引擎Aviator28ms极低高性能表达式LiteFlow120ms中流程编排专家3 如何技术选型?

2.png

黄金法则:


  • 简单场景:EasyRules + Aviator 组合拳
  • 金融风控:Drools 稳如老狗
  • 电商运营:QLExpress 灵活应变
  • 工作流驱动:LiteFlow 未来可期
4 避坑指南


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

  • QLExpress安全漏洞
  1. // 禁用危险方法
  2. runner.addFunctionOfServiceMethod("exit", System.class, "exit", null, null);
复制代码

  • 规则冲突检测
  1. // Drools冲突处理策略
  2. KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();
  3. config.setProperty("drools.sequential", "true"); // 按顺序执行
复制代码
总结


  • 能用:替换if/else(新手村)
  • 用好:规则热更新+可视化(进阶)
  • 用精:规则编排+性能优化(大师级)
曾有人问我:“规则引擎会不会让程序员失业?” 我的回答是:“工具永远淘汰不了思考者,只会淘汰手工作坊”
真正的高手,不是写更多代码,而是用更优雅的方式解决问题。
技术选型没有最好的,只有最合适的
最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。
求一键三连:点赞、转发、在看。
关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。
本文收录于我的技术网站:http://www.susan.net.cn

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册