拒绝 if...else 嵌套地狱!用 100KB 极轻量级 Java 规则引擎 Easy Rules 优雅解耦业务逻辑

在做 Java 代码 Review 时,我们经常会看到类似的典型场景:
一个核心折扣计算或风控拦截方法中,if...else 嵌套叠了七八层,单方法行数轻松突破 300 行。今天新增一条促销规则,明天修改一条风控条件,后天删除一个弃用分支 —— 使用硬编码堆砌条件分支,不仅可读性与可测试性极差,每次规则变更还必须修改源码、重新编译并重启服务。
如何将频繁变动的业务规则从代码中彻底抽离,让架构变得清爽、可扩展且支持动态调整?
今天为你推荐一款极小而美、开源免费的 Java 规则引擎 —— Easy Rules。
1. Easy Rules 核心概念与架构设计
Easy Rules (j-easy/easy-rules) 的设计灵感源自软件大师 Martin Fowler 提出的“规则即对象 (Rules as Objects)”概念。它的 Jar 包极其小巧(仅约 100KB),没有任何沉重的外部依赖,启动速度达到毫秒级。

Easy Rules 围绕以下四大核心抽象构建:
1.1 Rule(规则对象)
规则的抽象载体,包含 name(唯一名称)、description(描述)、priority(执行优先级,数字越小优先级越高)、condition(触发条件评估,返回 boolean)以及 action(满足条件后执行的操作)。
1.2 Facts(事实数据上下文)
规则执行时的数据容器,本质上是一个类型安全的键值对集合(Key-Value Map)。你可以把业务对象(如 User、Order)放入 Facts 中,规则方法会自动按参数提取。
1.3 Rules(规则容器)
管理一组规则的有序集合,内部会自动根据规则指定的 priority 优先级进行降序/升序排序。
1.4 RulesEngine(规则引擎执行器)
提供两种核心引擎实现:
- DefaultRulesEngine:按优先级顺序评估规则,条件满足即执行动作,适合绝大多数电商折扣、校验与风控场景。
- InferenceRulesEngine:采用前向链推理算法,在条件满足时反复循环评估,直到没有新规则触发为止,适合规则间存在深层依赖连锁反应的复杂场景。
2. 四种规则定义模式:从代码硬编码到配置化

Easy Rules 提供了极为灵活的四种规则定义模式,覆盖不同阶段的解耦需求:
2.1 模式一:POJO 注解声明(最常用)
基于普通的 Java 类加注解定义规则,直观且零学习成本:
@Rule(name = "VIP折扣规则", priority = 1)
public class VipDiscountRule {
@Condition
public boolean isVip(@Fact("user") User user) {
return user.isVip();
}
@Action
public void applyDiscount(@Fact("order") Order order) {
order.setDiscount(0.9);
}
}
2.2 模式二:Fluent 流式 API(动态构建)
适合规则条件需要在运行时根据传入参数动态拼装的场景:
Rule dynamicRule = new RuleBuilder()
.name("高温预警规则")
.priority(2)
.when(facts -> facts.get("temperature") > 30)
.then(facts -> System.out.println("警告:天气过热!"))
.build();
2.3 模式三:MVEL / SpEL 表达式(零重启热更新)
规则条件与动作通过字符串表达式指定,规则可直接存入数据库或配置中心,修改规则无需重新编译部署:
Rule mvelRule = new MVELRule()
.name("会员高额订单规则")
.when("user.vip == true && order.amount > 1000")
.then("order.discount = 0.85");
2.4 模式四:YAML / JSON 外部配置文件
适合将规则完全交由业务人员或运维进行配置化管理:
- name: "新用户首单折扣"
description: "新用户第一笔订单打8折"
priority: 3
condition: "user.newUser == true && user.orderCount == 0"
actions:
- "order.discount = 0.8"
通过 MVELRuleFactory 配合 YamlRuleDefinitionReader 即可一键加载运行。
3. 复合规则与高级监听器
3.1 复合规则组 (Composite Rules)
UnitRuleGroup(与逻辑):规则组内所有条件必须全部满足才会触发执行。ActivationRuleGroup(互斥高优先):只要有一个条件满足,仅执行优先级最高的那个规则,其余自动跳过。ConditionalRuleGroup(条件链):由第一个前置规则评估结果决定是否继续执行后续规则链。
3.2 生命周期 RuleListener 监听
支持实现 RuleListener 接口,在 beforeEvaluate、afterEvaluate、onSuccess 与 onFailure 阶段注入自定义逻辑,实现规则命中率统计、性能耗时分析与日志审计。
4. 总结与选型建议
Easy Rules 以仅 100KB 的微型体积,将复杂的业务逻辑从繁杂的 if...else 代码山中优雅释放。
- 优势: 零依赖、学习成本极低、支持注解/表达式/YAML 多种模式、无缝集成 Spring Boot。
- 适用场景: 电商促销活动、数据表单校验、规则树评估、风控规则路由等。
- 开源项目地址:
https://github.com/j-easy/easy-rules - 最新版本:
4.1.0
💻 配套实训环境与动手练习
本文涉及的相关技术指令、开发环境与工具链已内置在边学边练在线实验室中,无需繁琐安装配置,随时在浏览器中实践体验: