一款悄然崛起的国产规则引擎,让业务编排效率提升 10 倍!

大家好,我是 Guide。今天来推荐一款非常优秀的国产规则引擎,说不定你曾经就用过。下面是正文。

你有没有接过那种祖传代码?一个几千行的 if-else 堡垒,改一行逻辑,要测半天。更糟的是,业务方今天说要"先 A 后 B",明天又改成"A 和 B 并行,等 C 完成再接 D",每次改流程都要重构代码。

LiteFlow 是一个国产规则引擎,专门解决"业务逻辑耦合"问题。它把瀑布流式的代码拆成一个个独立组件,用一套 DSL 语法重新编排,改流程就像搭积木。

解决了什么问题?

传统复杂业务系统的痛点:

  • 改一处动全身:代码里到处是硬编码的流程判断,改个顺序要改好几个地方。
  • 难以热变更:业务流程调整需要重新发版,没法实时生效。
  • 组件复用难:每个业务场景都写一套逻辑,同样的代码在到处复制。

LiteFlow 的核心思路是 "工作台模式" :想象一个工厂流水线,n 个工人围着工作台,每个人只负责自己那道工序,完成就把半成品放回工作台,下一个人接着做。工人之间不需要沟通,只需要关心自己手头的活和工作台上的资源。

映射到代码世界:工人就是组件,工作台就是上下文,工序顺序就是规则配置。

下图是 LiteFlow 官方文档对核心能力(组件编排、实时热更替和复用)的图解:

LiteFlow 是什么?

LiteFlow 是一款国产开源的轻量级规则引擎框架,专注解决复杂业务逻辑的解耦与编排问题,支持 Spring Boot 2.x/3.x,最低 JDK 8 即可运行。

核心功能

  • 组件化拆分:把长链条的业务逻辑拆成独立组件,每个组件只做一件事。
  • 规则驱动编排:用简洁的 EL 表达式定义组件执行顺序,支持串行、并行、条件、循环等复杂逻辑。
  • 脚本组件支持 :支持 Java、JavaScript、Groovy、QLExpress、Python、Lua、Aviator 等多种脚本语言,Java 脚本编译速度在 v2.15.3 版本后提升了 200 倍(2000 个脚本从 30 秒降到 150 毫秒)。
  • 热部署能力:规则和脚本可以存放在数据库、注册中心(Nacos、Etcd、Zookeeper),修改后实时生效,无需重启。
  • 可视化编排 :支持 LiteFlowX 可视化编排界面,拖拽就能设计流程。
  • 自带简单监控:框架内自带一个命令行的监控,能够知道每个组件的运行耗时排行。

LiteFlow 的核心是基于 EL 表达式的规则解析引擎,在 v2.15.2 版本中,底层规则引擎从 QLExpress 3 全面升级到 QLExpress 4,带来性能提升:

测试指标 QL3 版本 QL4 版本 提升幅度
编译阶段 TPS 2,739 ops 3,636 ops 提升 32%
上下文参数注入 55,826 ops 222,625 ops 提升 300%

数据来源:LiteFlow 官方压测报告,采用 benchmark 框架,2 次预热、3 次执行取平均值。

QLExpress 是由阿里巴巴开源的轻量级动态脚本引擎,目标是将业务逻辑从繁重的 Java 代码中解耦,变成可以动态执行的脚本。

LiteFlow 在今年的 Gitee 年度开源项目评选中获得了基础软件赛道第二名的成绩。

快速上手

安装

xml 复制代码
<dependency>
    <groupId>com.yomahub</groupId>
    <artifactId>liteflow-spring-boot-starter</artifactId>
    <version>2.15.3</version>
</dependency>

LiteFlow 支持 JDK 8 ~ JDK 25 全版本,但如果你用 JDK 9+,建议直接上 v2.15.0+ 版本,无需额外配置 JVM 参数。

配置规则文件

application.properties 里指定规则文件位置:

properties 复制代码
liteflow.rule-source=config/flow.el.xml

然后在 resources/config/flow.el.xml 定义规则 THEN(validateOrder, WHEN(checkStock, calcPrice), riskCheck, saveOrder);

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<flow>
    <chain name="orderChain">
        THEN(
            validateOrder,
            WHEN(checkStock, calcPrice),
            riskCheck,
            saveOrder
        );
    </chain>
</flow>

这段表达式定义了执行的拓扑结构:

  • THEN:串行执行,必须先执行完前面的节点,才能进入下一个。
  • WHEN :并行执行,在此例中,checkStock(检查库存)和 calcPrice(计算价格)会同时开启异步线程执行,提升接口响应速度。

规则含义:先校验订单 → 然后并行查库存和算价格 → 再做风险检查 → 最后保存订单。

定义组件

通过实现 NodeComponent定义组件:

java 复制代码
@LiteflowComponent("validateOrder")
public class ValidateOrderCmp extends NodeComponent {

    @Override
    public void process() {
        // 从上下文获取订单数据
        OrderContext context = this.getContextBean(OrderContext.class);
        Order order = context.getOrder();

        // 校验逻辑
        if (order.getAmount() <= 0) {
            throw new IllegalArgumentException("订单金额必须大于0");
        }

        // 把结果放回上下文,供后续组件使用
        context.setValid(true);
    }
}
  • @LiteflowComponent :复合注解,将类声明为 Spring 的 Bean,并给组件起一个 ID(validateOrder),这个 ID 必须与 XML 文件中的名称对应。
  • getContextBean :LiteFlow 处理数据的精髓,流程中的所有组件共享一个(或多个)上下文对象,避免在方法间传递大量参数,实现逻辑解耦。

LiteFlow 在 v2.8.0 后支持多上下文,在执行的时候同时初始化你传入的多个上下文。在组件里也可以根据 class 类型很方便的拿到。

java 复制代码
// 传入
LiteflowResponse response = flowExecutor.execute2Resp("chain1", 流程初始参数, OrderContext.class, UserContext.class, SignContext.class);

// 获取
OrderContext orderContext = this.getContextBean(OrderContext.class);
UserContext userContext = this.getContextBean(UserContext.class);
SignContext signContext = this.getContextBean(SignContext.class);

同理定义其他组件(checkStockcalcPriceriskChecksaveOrder)。

执行流程

java 复制代码
@Service
public class OrderService {

    @Resource
    private FlowExecutor flowExecutor;

    public void createOrder(Order order) {
        LiteflowResponse response = flowExecutor.execute2Resp(
            "orderChain",
            order,              // 将数据作为初始参数
            OrderContext.class  // 让 LiteFlow 自动实例化上下文
        );
    }
}

《SpringAI 智能面试平台+RAG 知识库》配套实战项目教程正在更新,涉及到 Prompt Engineering、大模型集成、RAG(检索增强生成)、高性能对象存储与向量数据库。后续的话,还会同步上 Agent 项目。

内容非常全面,非常适合想要实战 AI 项目或者准备 AI 大模型应用开发岗位面试的朋友,来一张刚写完的3.4w 字+35 道题目 的 RAG 面试题总结,大家感受一下(点此链接了解: 星球):

使用场景

场景一:电商价格引擎

电商的价格计算通常涉及多个维度:原价、会员折扣、优惠券、满减活动、店铺优惠等。用 LiteFlow 可以把每个计算因子拆成独立组件,用规则灵活组合。

规则示例

xml 复制代码
<chain name="priceChain">
    THEN(
        getBasePrice,
        WHEN(
            memberDiscount,
            couponDiscount,
            activityDiscount
        ),
        finalPrice,
        savePrice
    );
</chain>

好处是:新增一种优惠类型,只需要加一个组件,然后在规则里配上位置,不用改现有代码。

场景二:复杂审批流程

LiteFlow 不做"基于角色的审批流转"(那是 Flowable、Flowlong 这类工作流引擎的事),但它适合处理审批环节里的业务逻辑

比如一个采购审批,需要:

  1. 校验采购金额是否超预算
  2. 并行查询供应商库存和价格
  3. 根据金额走不同的风控规则
  4. 生成采购单

这些逻辑用 LiteFlow 编排,比写在 Service 里要清晰。

场景三:数据清洗 ETL

数据处理场景里,经常有多个清洗步骤:去重、格式转换、数据补全、质量检查。用 LiteFlow 可以把这些步骤组件化,根据不同数据源配置不同规则。

场景四:实时风控决策

风控规则变化频繁,用脚本组件 + 规则热部署,可以在不停机的情况下调整规则。比如:"最近欺诈多了,把某类交易的阈值从 1000 降到 500",改一下脚本配置就行。

EL 规则语法

LiteFlow 的 EL 语法是其核心竞争力,十分钟就能上手,但能编排出非常复杂的流程。

基本语法

串行(THEN/SER):按顺序执行

xml 复制代码
THEN(a, b, c, d)
<!-- 或者用语义更明确的 SER -->
SER(a, b, c, d)

并行(WHEN/PAR):同时执行

xml 复制代码
WHEN(a, b, c)
<!-- 或者用 PAR -->
PAR(a, b, c)

嵌套组合

xml 复制代码
THEN(
    a,
    WHEN(b, THEN(c, d)),
    e
)

规则含义:先执行 a → 然后并行执行 b 和"先 c 后 d" → 最后执行 e。

高级特性

忽略错误(ignoreError)

xml 复制代码
THEN(
    a,
    WHEN(b, c, d).ignoreError(true),
    e
)

即使 b、c、d 中有组件报错,e 仍会执行。

任一完成则继续(any)

xml 复制代码
THEN(
    a,
    WHEN(b, c, d).any(true),
    e
)

b、c、d 中任何一个先完成,就忽略其他继续往下走。

指定必须等待的节点(must)

xml 复制代码
WHEN(b, c, d).must(b, c)

b、c 必须等执行完,d 如果还没完就忽略。

按比例完成(percentage)

xml 复制代码
WHEN(a, b, c, d, e).percentage(0.6)

5 个组件里随机执行 3 个(5 × 0.6 = 3),完成就继续。

不适合什么场景?

  • 审批流转:LiteFlow 只做基于逻辑的流转,不做基于角色任务的流转。如果要实现"A 审批完传给 B,B 审批完传给 C"这类场景,应该用 Flowable 或 Flowlong。
  • 简单业务:如果一个流程只有 2-3 个步骤,且基本不会变,上规则引擎可能有点杀鸡用牛刀。
  • 超大规模并行计算:如果并行组件达到成百上千个,且涉及极其复杂的线程调度,LiteFlow 虽然能做,但它更偏向业务流程编排,而非大数据分布式计算引擎(如 Spark/Flink)。

与其他方案对比

对比维度 LiteFlow 自己写 if-else Flowable/Flowlong
学习曲线 低(EL 语法简单) 最低(原生 Java) 中(需理解 BPMN)
流程灵活性 高(规则驱动) 低(硬编码) 中(需重新部署)
热部署 ✅ 支持 ❌ 需要发版 ✅ 支持
脚本支持 ✅ 多种语言 ❌ 无 ⚠️ 有限支持
适用场景 复杂业务逻辑编排 简单流程 审批流转
性能 高(8.6 万+ TPS) 取决于实现 中(有状态机开销)
国产支持 ✅ 国产 N/A ⚠️ Flowlong 国产

总结

LiteFlow 把复杂业务逻辑从"面条代码"变成了"搭积木",改流程不再动全身,尤其适合那些业务规则频繁变化、步骤多且有并行需求的系统。

脚本组件性能 :v2.15.3 版本把 Java 脚本编译速度提升了 200 倍 ,主要是因为该版本对 Liquor 批量编译特性的支持。Liquor 是一款源自 Arthas 核心、支持 "jar in jar" 且轻量的 Java 动态编译与脚本工具,能让开发者在运行时以接近原生的性能灵活执行 Java 代码。

适合人群

  • 饱受 if-else 嵌套困扰的后端开发者
  • 需要频繁调整业务流程的系统(电商、金融、风控)
  • 想把业务逻辑从代码里剥离出来的架构师

使用建议

  • 先从一个简单的流程开始,别一上来就搞最复杂的
  • 组件拆分要合理:每个组件只做一件事,做好一件事
  • 规则文件记得做版本管理,出了问题好回滚
  • 如果用脚本组件,建议用 Java 脚本(liteflow-script-javax-pro),性能最好

Gitee 地址:gitee.com/dromara/lit...

相关推荐
吃虫子的人6 小时前
记录使用Arthas修改线上源码重新加载的一次过程
java·arthas
figo10tf6 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva7 小时前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端
橙露7 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
小程故事多_807 小时前
Agent Infra核心技术解析:Sandbox sandbox技术原理、选型逻辑与主流方案全景
java·开发语言·人工智能·aigc
冰暮流星7 小时前
sql语言之分组语句group by
java·数据库·sql
望舒5137 小时前
代码随想录day25,回溯算法part4
java·数据结构·算法·leetcode
黎雁·泠崖7 小时前
【魔法森林冒险】3/14 Allen类(一):主角核心属性与初始化
java·开发语言
程序员敲代码吗7 小时前
Spring Boot与Tomcat整合的内部机制与优化
spring boot·后端·tomcat