当前位置: 首页 > news >正文

Solon 集成 LiteFlow:轻量级工作流引擎的极简实践指南

在复杂的业务场景中,工作流引擎是解耦业务逻辑、提升可维护性的核心组件。传统的BPM引擎(如 Activiti、Flowable)虽功能强大,但学习曲线陡峭且资源消耗较大。LiteFlow 作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择。本文将详细讲解 Solon 集成 LiteFlow 的全过程,助你轻松驾驭轻量级流程编排。

一、LiteFlow核心优势

  • 轻量嵌入:仅需2个核心JAR包,无数据库依赖
  • 规则驱动:基于EL表达式的链式规则配置,变更实时生效
  • 组件化设计:业务逻辑封装为可复用组件,支持热插拔
  • 高性能:无反射执行,单线程每秒可处理万级任务
  • 多类型支持:顺序流、条件分支、循环、嵌套、异步并行

二、Solon 集成实战

准备:添加依赖包

<!-- pom.xml 依赖 -->
<dependencies><dependency><groupId>com.yomahub</groupId><artifactId>liteflow-solon-plugin</artifactId><version>最新版</version></dependency>
</dependencies>

步骤1:定义流程组件

import com.yomahub.liteflow.core.NodeComponent;
import org.noear.solon.annotation.Managed;// 普通组件示例
@Managed("paymentAction")
public class PaymentAction extends NodeComponent {@Overridepublic void process() {PaymentContext context = this.getContextBean(PaymentContext.class);// 执行支付逻辑System.out.println("处理支付, 订单:" + context.getOrderId());}
}// 条件组件示例(用于分支判断)
@Managed("userCheck")
public class UserCheck extends NodeComponent {@Overridepublic void process() {UserContext context = this.getContextBean(UserContext.class);if(context.isVip()) {this.setIsEnd(true);  // 终止流程}}
}

步骤2:配置流程规则

resources/flow.yml 配置EL表达式规则:

liteflow:rule-source: config/flow.el.xml

resources/config/flow.el.xml

<?xml version="1.0" encoding="UTF-8"?>
<flow><chain name="orderProcess">THEN(initOrder, WHEN(checkInventory, checkUserCredit),SWITCH(choosePayWay).TO(CASE(aliPay).DO(aliPayAction),CASE(wechatPay).DO(wechatPayAction)),AFTER(paymentAction).WHEN(userCheck));</chain>
</flow>

步骤3:初始化上下文并执行流程

import com.yomahub.liteflow.core.FlowExecutor;
import com.yomahub.liteflow.flow.LiteflowResponse;
import org.noear.solon.annotation.*;@Controller
public class OrderController {@Injectprivate FlowExecutor flowExecutor;@Post@Mapping("/submitOrder")public String submitOrder(@Body OrderDTO order) {OrderContext context = new OrderContext();context.setOrderId(order.getId());context.setAmount(order.getAmount());LiteflowResponse response = flowExecutor.execute2Resp("orderProcess", context, OrderContext.class);return response.isSuccess() ? "订单成功" : "流程失败";}
}

三、高级特性应用

异步并行执行

<!-- 配置并行节点 -->
<chain name="parallelChain">THEN(a, WHEN(b, c, d),  <!-- b,c,d并行执行 -->e);
</chain>

嵌套子流程

<chain name="mainFlow">THEN(prepare, SUB(orderProcess), notify);
</chain>

组件降级处理

import com.yomahub.liteflow.core.NodeComponent;
import org.noear.solon.annotation.Managed;@Managed("paymentAction")
public class PaymentAction extends NodeComponent {@InjectFallbackService fallbackService;@Overridepublic void process() {...}@Overridepublic void onError() {// 支付失败时执行补偿逻辑fallbackService.compensate();}
}

规则热更新

import com.yomahub.liteflow.flow.FlowBus;
import org.noear.solon.annotation.Managed;
import org.noear.solon.core.bean.LifecycleBean;// 动态添加规则
FlowBus.addChain("newChain", "THEN(a,b,c)");// 监听规则变化
@Managed
public class FlowConfig implements LifecycleBean {@Overridepublic void postStart() throws Throwable {FileWatcher.watch(Paths.get("config/flow"),() -> FlowBus.reloadRule());}
}

四、监控与调试

流程跟踪

LiteflowResponse response = flowExecutor.execute2Resp("orderProcess", context, OrderContext.class,// 开启执行链路跟踪SlotCallbackBuilder.builder().build()
);System.out.println(response.getExecuteStepStr());

输出示例:initOrder[✓] => checkInventory[✓] => checkUserCredit[✓] => ...

可视化监控(需企业版)

liteflow:monitor:enable-log: truequeue-limit: 200delay: 30period: 120

五、最佳实践建议

上下文设计原则

  • 使用独立Context对象传递流程数据
  • 避免在组件中操作数据库事务(应在Service层控制)

组件规范

  • 单个组件代码不超过200行
  • 组件命名采用"业务域+操作"格式(如:stockDeduct)

异常处理

  • 业务异常通过 throw BusinessException 中断流程
  • 系统异常自动触发 onError 回调

规则管理进阶

// 从数据库加载规则
@Managed
public class DBRuleLoader implements RuleSource {@Overridepublic String loadRules() {return ruleMapper.selectByApp("order-service");}
}

结语

通过 Solon 集成 LiteFlow,我们实现了:

  • 业务可视化编排:复杂流程通过EL表达式清晰定义
  • 组件热插拔:新增业务节点无需停服
  • 极致性能:单机万级TPS满足高并发场景
  • 灵活扩展:支持自定义节点、拦截器、上下文

在微服务架构下,LiteFlow 的轻量级特性使其成为业务流程编排的理想选择。其简洁的API设计让开发者能快速上手,而强大的异步并行、嵌套流程等特性又能支撑复杂业务场景。

http://www.sczhlp.com/news/365.html

相关文章:

  • 街道【概念】
  • 解决 EXSI 意外断电后虚拟机无法启动,提示对象类型需要托管的 I/O - 清风
  • P3412 仓鼠找sugar II 题解
  • 中国科学院院士夏培肃|学术成长历程的关键事件、重要节点、师承关系
  • 【深度解析】文件安全传输网关解决方案,安全合规哪家强?
  • 非常棒的unity插件——体素世界
  • 开源新旗舰 GLM-4.5:不想刷榜,只想干活儿
  • Nodejs安装笔记
  • 「中望CAD机械版2025最新版下载+浮动许可激活教程」
  • 2025最新文件摆渡系统评测:这5大功能让跨网传输更高效
  • Fastmcp 案例三(DeepChat调式 ,结合案例二)
  • webdriver中的三种等待
  • Python 操作 PDF 文档:主流库选型指南 - E
  • claudecode使用mcp
  • 服务器数据同步:安全高效方案看这里!
  • 微软云(Windows Azure)计算平台的结构及分析
  • 大师 - 杯酒
  • 常用网址
  • 教师资格证考试面试报名流程
  • 平衡树(未完待续)
  • 告别FTP!跨网文件安全交换系统让数据流转0风险
  • CVE-2018-8715 AppWeb认证绕过漏洞 (复现)
  • 树04
  • 周进度报告1
  • 白话Docker系列(二):用Web应用实例深入容器
  • svn强制添加已忽略文件
  • 跨网文件交换新方案:合规审批+传输加密双保障!
  • FastMcp 案例四(Streamable-http)
  • 数仓ETL建设思路
  • SSH-Agent 启用失败问题