聊聊流程编排框架LiteFlow

大家好,我是G探险者!

今天聊一聊流程编排框架,liteflow

1. 什么是 LiteFlow

LiteFlow 是一个开源的 Java 业务流程编排框架,适合把一段较长的后端业务拆成多个可复用的处理节点,再通过流程定义把这些节点按顺序、条件或并行方式组合起来执行。

它的定位不是传统 BPM、工作流审批平台,也不是规则引擎,而是更偏向于服务端业务链路编排。常见应用场景包括:

  • 数据管道处理
  • MQ 消息消费编排
  • 外部系统同步
  • 复杂表单提交后的分阶段处理
  • 多场景共用一批处理步骤的业务系统

如果一个系统里经常出现下面这类代码:

java 复制代码
if (typeA) {
    init();
    validate();
    save();
    sendMq();
} else if (typeB) {
    init();
    transform();
    callRemote();
} else if (typeC) {
    init();
    validate();
    callRemote();
    save();
}

那么就很适合考虑用 LiteFlow 把这些步骤拆开管理。

2. LiteFlow 解决了什么问题

在没有流程编排框架时,业务代码通常会遇到这些问题:

  • 同一个步骤在多个场景里重复出现
  • 分支越来越多,if/else 越来越重
  • 处理顺序写死在代码里,修改流程要改源码
  • 代码里混杂初始化、校验、转换、落库、发消息等多种职责
  • 新场景接入时只能复制旧逻辑再改

LiteFlow 的核心思路是:

  1. 把业务拆成一个个小节点
  2. 每个节点只做一件事
  3. 用流程定义把节点拼起来
  4. 用统一执行器去运行流程

这样可以让业务链路更清晰,也更容易复用和扩展。

3. LiteFlow 的核心概念

3.1 Node 节点

节点是 LiteFlow 的最小执行单元。通常一个节点只负责一类动作,例如:

  • 参数初始化
  • 数据校验
  • 状态过滤
  • DTO 转实体
  • 落库
  • 调用外部接口
  • 发送 MQ

在代码里,节点一般通过继承 NodeComponent 来实现:

java 复制代码
@LiteflowComponent("demoCmp")
public class DemoCmp extends NodeComponent {
    @Override
    public void process() throws Exception {
        System.out.println("execute demoCmp");
    }
}

这里的 "demoCmp" 就是节点 ID,后续在流程定义里会引用它。

3.2 Chain 流程链

流程链表示多个节点的组合方式。最常见的是串行:

yaml 复制代码
chain:
  - name: demoFlow
    value: "THEN(a, b, c)"

它表示执行顺序是:

a -> b -> c

3.3 FlowExecutor 执行器

执行器负责真正触发流程:

java 复制代码
LiteflowResponse response = flowExecutor.execute2Resp("demoFlow", null, context);

这里的 "demoFlow" 是流程名,context 是执行时携带的数据上下文。

3.4 Context 上下文

上下文用于在整条流程中传递公共数据。常见做法是定义一个 Java Bean:

java 复制代码
public class DemoContext {
    private String id;
    private String type;
    private String data;
}

执行流程时把它传进去,节点内部再读取:

java 复制代码
DemoContext context = this.getContextBean(DemoContext.class);

3.5 Slot

Slot 可以理解成一次流程执行过程中的运行时容器。除了上下文 Bean,LiteFlow 还允许通过 slot 在节点之间传递中间结果。

这在"上一个节点把原始数据转换成业务对象,下一个节点继续处理"的场景里很常见。

4. LiteFlow 的常见编排能力

LiteFlow 不只是串行流程。它支持多种编排表达式。

4.1 串行

text 复制代码
THEN(a, b, c)

表示顺序执行。

4.2 并行

text 复制代码
WHEN(a, b, c)

表示并行执行多个节点。

4.3 条件分支

text 复制代码
IF(x, a, b)

根据条件节点或表达式选择分支。

4.4 多路选择

text 复制代码
SWITCH(x).TO(a, b, c)

根据不同条件走不同流程。

4.5 组合与嵌套

LiteFlow 支持把串行、并行、条件嵌套组合,适合更复杂的业务链。

5. LiteFlow 的典型使用方式

一个最小可用的 LiteFlow 例子通常包含以下几个部分。

5.1 引入依赖

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

5.2 定义节点

java 复制代码
@LiteflowComponent("validateCmp")
public class ValidateCmp extends NodeComponent {
    @Override
    public void process() {
        System.out.println("validate");
    }
}
java 复制代码
@LiteflowComponent("saveCmp")
public class SaveCmp extends NodeComponent {
    @Override
    public void process() {
        System.out.println("save");
    }
}

5.3 定义流程

yaml 复制代码
flow:
  chain:
    - name: submitFlow
      value: "THEN(validateCmp, saveCmp)"

5.4 配置规则源

yaml 复制代码
liteflow:
  rule-source: liteFlow.yml

5.5 执行流程

java 复制代码
LiteflowResponse response = flowExecutor.execute2Resp("submitFlow", null, context);
if (!response.isSuccess()) {
    throw new RuntimeException("flow execute failed");
}

6. LiteFlow 的优点

6.1 流程清晰

相比把流程顺序直接写在代码里,LiteFlow 可以把链路显式表达出来。阅读者可以很快知道某个场景到底会经过哪些步骤。

6.2 节点可复用

同一个节点可以被多条流程复用。例如:

  • validateCmp 可以给新增流程使用
  • 也可以给 MQ 消费流程使用

6.3 便于扩展

新增场景时,通常只需要新增流程定义,或者在原流程上拼接几个新节点,而不是复制整段业务代码。

6.4 职责更清晰

把"初始化、校验、转换、输出"拆成独立节点后,单个类更短,责任更明确。

6.5 适合数据管道类业务

凡是"输入数据 -> 处理步骤 -> 输出结果"这类链路,都很适合用 LiteFlow 组织。

7. LiteFlow 的局限和风险

7.1 配置和代码双重维护

LiteFlow 的流程定义通常写在配置中,而节点逻辑写在 Java 代码中。链路排查时需要同时看两边。

7.2 名字强依赖

流程名、节点名、上下文类型名如果写错,问题往往不会在编译期暴露,而是在运行时体现。

7.3 类型安全弱于直接编码

很多项目会使用 slot 传递中间结果。如果管理不好,节点之间容易出现类型不一致的问题。

7.4 过度拆分会让代码难读

如果本来只有两步简单逻辑,却拆成十几个节点,反而会提高理解成本。

7.5 调试链路变长

问题可能出在:

  • 流程定义
  • 节点注册
  • 节点执行顺序
  • 上下文传递
  • 中间数据结构

所以调试通常比普通单方法代码更复杂。

8. LiteFlow 适合什么场景

适合:

  • 多种业务场景共享一批步骤
  • 不同来源的数据要走不同处理链
  • 流程经常增删节点
  • 需要把校验、转换、输出解耦
  • 需要让业务链路表达得更清楚

不太适合:

  • 极简单的 CRUD
  • 只有一两步处理的直线逻辑
  • 强依赖超长事务的复杂编排
  • 需要完整业务流程可视化建模的平台型产品

9. LiteFlow 和传统工作流的区别

LiteFlow 和 BPMN、Activiti、Flowable 这类工作流引擎不是一个层级的东西。

它们大致区别如下:

9.1 LiteFlow

  • 偏后端代码编排
  • 轻量
  • 面向开发人员
  • 强调节点组合
  • 更适合服务内部链路

9.2 传统工作流引擎

  • 偏业务流程引擎
  • 支持审批流、流程图、流程实例管理
  • 更强调流程持久化和可视化
  • 更适合人参与的长流程

简单说,LiteFlow 更像"程序员用的业务装配器"。

10. 一个实践上的设计建议

如果决定在项目里使用 LiteFlow,建议遵守以下约束:

10.1 一个节点只做一件事

不要在一个节点里同时做校验、转换、落库、发 MQ。

10.2 节点命名统一

例如统一使用:

  • xxxSlotInitCmp
  • xxxValidatorCmp
  • xxxConvertCmp
  • xxxDBOutputCmp
  • xxxMqOutputCmp

10.3 上下文模型稳定

尽量明确每条链路的输入输出数据结构,减少节点间"隐式约定"。

10.4 配置和代码同步维护

改流程定义时,要同步检查:

  • 节点名称是否一致
  • 流程名是否一致
  • 路由逻辑是否一致

10.5 不要为了用框架而用框架

如果业务只有两三步,直接写服务代码往往更简单。

11. 结合当前工程的理解

在当前项目中,LiteFlow 的用法非常典型:

  • 通过 topic/subTopic 决定走哪条业务链
  • 通过 liteFlow.yml 定义节点和流程
  • 通过 NodeComponent 实现每个步骤
  • 通过 FlowExecutor 执行整条链

这里它承担的角色不是规则计算,而是"数据处理流程编排":

  • API 输入和 MQ 输入统一走编排入口
  • 不同业务主题走不同链路
  • 链路中的步骤大多是初始化、校验、转换、落库、发消息

这说明当前工程使用 LiteFlow 的方向是合理的,属于它比较擅长的场景。

12. 总结

LiteFlow 是一个适合后端业务链路拆分与编排的开源框架。它的核心价值在于:

  • 把流程拆开
  • 把步骤复用起来
  • 让链路更清楚
  • 让扩展更容易

它非常适合数据管道、MQ 消费、外部系统同步这类"多场景共享处理步骤"的系统。但如果业务本身很简单,直接编码通常更合适。

是否采用 LiteFlow,不应只看它是否开源或是否流行,而应看当前业务是否真的存在流程编排、步骤复用、场景扩展这些需求。

相关推荐
随风,奔跑2 小时前
Spring Security
java·后端·spring
饕餮争锋2 小时前
CLI为什么在大模型领域流行
后端·ai
言慢行善3 小时前
SpringBoot中的注解介绍
java·spring boot·后端
小村儿3 小时前
连载05-Claude Skill 不是抄模板:真正管用的 Skill,都是从实战里提炼出来的
前端·后端·ai编程
光电大美美-见合八方中国芯4 小时前
用于无色波分复用光网络的 10.7 Gb/s 反射式电吸收调制器与半导体光放大器单片集成
网络·后端·ai·云计算·wpf·信息与通信·模块测试
MX_93594 小时前
Spring MVC拦截器
java·后端·spring·mvc
MgArcher4 小时前
Python高级特性:高阶函数完全指南
后端·面试
databook4 小时前
逃离SQL丛林:实用主义的数据救赎
后端·sql·数据分析
舒一笑5 小时前
AI 系统落地难的,从来不只是模型:一次企业级部署实施复盘
运维·后端·程序员