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

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

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

Easy Rules 极轻量级 Java 规则引擎

在做 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 4 大核心抽象数据流向与执行架构图

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 四种规则定义模式对比示意图

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

💻 配套实训环境与动手练习

本文涉及的相关技术指令、开发环境与工具链已内置在边学边练在线实验室中,无需繁琐安装配置,随时在浏览器中实践体验:

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有