惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tor Project blog
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
G
Google Developers Blog
J
Java Code Geeks
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
Cisco Talos Blog
Cisco Talos Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
I
Intezer
Jina AI
Jina AI
T
Tenable Blog
P
Palo Alto Networks Blog
Project Zero
Project Zero
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
The Hacker News
The Hacker News
F
Full Disclosure
Cloudbric
Cloudbric
量子位
H
Heimdal Security Blog
K
Kaspersky official blog
有赞技术团队
有赞技术团队
罗磊的独立博客
V
Vulnerabilities – Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
Recent Announcements
Recent Announcements
WordPress大学
WordPress大学
GbyAI
GbyAI
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
Recorded Future
Recorded Future
Security Archives - TechRepublic
Security Archives - TechRepublic
AI
AI
Webroot Blog
Webroot Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Exploit Database - CXSecurity.com
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hacker News: Front Page
Latest news
Latest news

博客园 - 漫思

python项目的构建 nodejs构建CICD时的思考  成为 AI 智能体工程师的 10 个步骤 es6的 yield python 中的 yield 笔记本的A壳 thinkpad 更换 reduce() in Python python的字段赋值和取值的操作 python的语法类似于lodash分组展开,合并分组操作 SelectMany C# lodash 数组的常用做法 lodash里面的常用方法 技术的边界 Reduce 和 Transduce 的含义 尤雨溪创办的 VoidZero 官宣加入 Cloudflare,前端 Vite 等保持开源 Ramda 函数库参考教程 ramda es 数组的方法 flatmap map object.entity的教程 Map与FlatMap:在数据处理中的区别与联系 flat、flatmap与map的用法区别1 flat、flatmap与map的用法区别 AI不是从天而降,它经历了七十年三起三落:读懂AI的第三课 Agent 17 种架构模式 分析 & 思考 只有踩过坑才懂:前端生成唯一 ID,别用 Date.now ()了!试试它crypto.randomUUID() FastAPI python并发 代码是 AI 写的,生产事故谁背锅? AI Agent 走出 Demo 幻觉的唯一解药:Harness Engineering 高管的 AI 精神病 小米开源可控视频音效生成模型 ControlFoley ​IBM 联合红帽投资 50 亿美元:帮助企业确保开源软件安全 国家大基金领投 DeepSeek,首轮融资投前估值 450 亿美元 SpaceX 自研 AI 训练栈 V1.0 接近完工:用 C 重写、适配 22 万块 GB300 GPU 高管的 AI 精神病 - 漫思 做一款企业真正敢用的AI测试应用,到底有多难?究竟难在哪? - 漫思 工良吐槽篇:万字长文细说 AI 落地之笑谈 koarouter的路由基本能力 7. 简单语句 class-validator class- @koa/router 分路由 这是我见过的最好的koa2 classvalidate typeorm的能力 HLS.js destroy时会取消请求吗 从入门到精通:2025年本体管理工具选型指南,8款工具助你驾驭语义网络 一文入门智能体:dify 超快速构建AI agent C# 15 类型系统改进:Union Types skill网站 应无所住,而生其心 process.stdin.isTTY 谷歌学术走过风雨十年 听创始人畅谈苦辣酸甜 - 漫思 process.stdin.isTTY 是false的具体情况 asyncio 较为复杂的demo asyncio 简单demo python Annotated 独家解读:淘宝使用 Node.js 的 TypeScript 多场景开发和实践 mac uv 使用 Python 包管理工具 uv 使用教程 Python依赖管理新标杆:UV工具安装与实战指南 python的uv lobehubui python的enum通过int进行初始化 python的枚举类型 深度拆解:AI 智能体 Harness 的构造【译】 LlamaIndex是什么?LlamaIndex综述!看这一篇就够了! python和langchain的简单教程 nodejs的顶尖开源项目 基础Pydantic+TypedDict+Annotated +Dataclass 深度解析Python结构化数据工具:dataclass、Pydantic Model与TypedDict 被 LangChain 全家桶搞晕了?LangGraph、LangSmith、LangFlow 一文读懂 - 漫思 谁才是企业级开源平台的优选?OpenCSG与Dify、Coze、Langflow、Ollama 的差异化之路 四大框架全景解析:LangChain、LangGraph、DeepAgent、LangFlow 测试数据管理方式对比:dict vs dataclass vs TypedDict 革命性的写作:MDX 让你的 Markdown 全面动起来 Python - pydantic 入门介绍与 Models 的简单使用 欢迎使用 Pydantic¶ python模块导入 Python 里通常说“数组切片”,大多数时候指的是列表切片。基本格式是: 自定义hook的写法 Python 遍历字典的8种方法 python基础教程 or的简单用法 C# 15 引入了 联合类型 asyncio的基础理论 flask配置热更新 Form.Item 无法直接绑定两个 name Form.Item 的双向翻译官:getValueFromEvent 与 getValueProps Knex.js入门指南:Node.js最强大的SQL查询构建器 knex.js1 Knex.js RFC 9535:JSONPath 的标准化之路 C#多线程Thread.Join()的详解 Pretext:值得关注的文本排版引擎 Flask入门(四):Flask静态文件及配置 【高并发】消息队列思路 为何高并发系统中都要使用消息队列?这次彻底懂了! Node.js 消息队列应用:RabbitMQ、Kafka 与处理高并发任务 大文件上传下载处理方案-断点续传,秒传,分片,合并 Node.js 缓存策略优化:Redis、Memcached 与本地缓存实现 .NET开发者的救星:8个让你告别996的高效库 别再吹牛了,100% Vibe Coding 存在无法自洽的逻辑漏洞!
这5种规则引擎,真香!
漫思 · 2026-06-23 · via 博客园 - 漫思

这5种规则引擎,真香!

前言

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

想象一个电商促销场景:

// 传统硬编码方式(噩梦开始...)
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"));
    }
    
    

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

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

  1. 规则外置存储(数据库/文件)
  2. 支持动态加载
  3. 声明式规则语法
  4. 独立执行环境

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

1.五大常用规则引擎

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

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

适用场景:

  • 金融风控规则(上百条复杂规则)
  • 保险理赔计算
  • 电商促销体系

实战:折扣规则配置

// 规则文件 discount.drl
rule "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); 

优点

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

缺点

  • 不支持复杂规则链
  • 缺少可视化界面

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

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;
    }
});

优点

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

缺点

  • 调试困难
  • 复杂规则可读性差

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

1.4 Aviator:高性能表达式专家

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

适用场景:

  • 实时定价引擎
  • 风控指标计算
  • 大数据字段加工

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

// Aviator 表达式
Expression exp = AviatorEvaluator.compile("user.age > 18 && order.amount > 100");
exp.execute(map);

引擎耗时
Aviator 220ms
Groovy 1850ms

编译优化:

// 开启编译缓存(默认开启)
AviatorEvaluator.getInstance().useLRUExpressionCache(1000);

// 字节码生成模式(JDK8+)
AviatorEvaluator.setOption(Options.ASM, true);

优点

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

缺点

  • 只支持表达式
  • 不支持流程控制

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

1.5 LiteFlow:规则编排新物种

官网:https://liteflow.com/

适用场景:

  • 复杂业务流程
  • 订单状态机
  • 审核工作流

编排示例:

<chain name="orderProcess">
    <then value="checkStock,checkCredit"/> 

Java调用:

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

优点

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

缺点

  • 新框架文档较少
  • 社区生态待完善

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

2 五大规则引擎横向评测

image

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

引擎耗时内存占用特点
Drools 420ms 功能全面
Easy Rules 38ms 轻量易用
QLExpress 65ms 阿里系脚本引擎
Aviator 28ms 极低 高性能表达式
LiteFlow 120ms 流程编排专家

3 如何技术选型?

image

黄金法则:

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

4 避坑指南

  1. Drools内存溢出
// 设置无状态会话(避免内存积累)
KieSession session = kContainer.newStatelessKieSession();
  1. QLExpress安全漏洞
// 禁用危险方法
runner.addFunctionOfServiceMethod("exit", System.class, "exit", null, null);
  1. 规则冲突检测
// Drools冲突处理策略
KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();
config.setProperty("drools.sequential", "true"); 

总结

  1. 能用:替换if/else(新手村)
  2. 用好:规则热更新+可视化(进阶)
  3. 用精:规则编排+性能优化(大师级)

曾有人问我:“规则引擎会不会让程序员失业?” 我的回答是:“工具永远淘汰不了思考者,只会淘汰手工作坊”

真正的高手,不是写更多代码,而是用更优雅的方式解决问题。

技术选型没有最好的,只有最合适的

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。

本文收录于我的技术网站:http://www.susan.net.cn

免责声明:本内容来自平台创作者,博客园系信息发布平台,仅提供信息存储空间服务。