找回密码
 立即注册
首页 业界区 业界 Solon 集成 LiteFlow:轻量级工作流引擎的极简实践指南 ...

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

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


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

准备:添加依赖包
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>com.yomahub</groupId>
  4.         liteflow-solon-plugin</artifactId>
  5.         <version>最新版</version>
  6.     </dependency>
  7. </dependencies>
复制代码
步骤1:定义流程组件
  1. import com.yomahub.liteflow.core.NodeComponent;
  2. import org.noear.solon.annotation.Managed;
  3. // 普通组件示例
  4. @Managed("paymentAction")
  5. public class PaymentAction extends NodeComponent {
  6.     @Override
  7.     public void process() {
  8.         PaymentContext context = this.getContextBean(PaymentContext.class);
  9.         // 执行支付逻辑
  10.         System.out.println("处理支付, 订单:" + context.getOrderId());
  11.     }
  12. }
  13. // 条件组件示例(用于分支判断)
  14. @Managed("userCheck")
  15. public class UserCheck extends NodeComponent {
  16.     @Override
  17.     public void process() {
  18.         UserContext context = this.getContextBean(UserContext.class);
  19.         if(context.isVip()) {
  20.             this.setIsEnd(true);  // 终止流程
  21.         }
  22.     }
  23. }
复制代码
步骤2:配置流程规则

resources/flow.yml 配置EL表达式规则:
  1. liteflow:
  2.   rule-source: config/flow.el.xml
复制代码
resources/config/flow.el.xml:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <flow>
  3.     <chain name="orderProcess">
  4.         THEN(
  5.             initOrder,
  6.             WHEN(
  7.                 checkInventory,
  8.                 checkUserCredit
  9.             ),
  10.             SWITCH(choosePayWay).TO(
  11.                 CASE(aliPay).DO(aliPayAction),
  12.                 CASE(wechatPay).DO(wechatPayAction)
  13.             ),
  14.             AFTER(paymentAction).WHEN(userCheck)
  15.         );
  16.     </chain>
  17. </flow>
复制代码
步骤3:初始化上下文并执行流程
  1. import com.yomahub.liteflow.core.FlowExecutor;
  2. import com.yomahub.liteflow.flow.LiteflowResponse;
  3. import org.noear.solon.annotation.*;
  4. @Controller
  5. public class OrderController {
  6.     @Inject
  7.     private FlowExecutor flowExecutor;
  8.     @Post
  9.     @Mapping("/submitOrder")
  10.     public String submitOrder(@Body OrderDTO order) {
  11.         OrderContext context = new OrderContext();
  12.         context.setOrderId(order.getId());
  13.         context.setAmount(order.getAmount());
  14.         
  15.         LiteflowResponse response = flowExecutor.execute2Resp(
  16.             "orderProcess",
  17.             context,
  18.             OrderContext.class
  19.         );
  20.         
  21.         return response.isSuccess() ? "订单成功" : "流程失败";
  22.     }
  23. }
复制代码
三、高级特性应用

异步并行执行
  1. <chain name="parallelChain">
  2.     THEN(
  3.         a,
  4.         WHEN(b, c, d),  
  5.         e
  6.     );
  7. </chain>
复制代码
嵌套子流程
  1. <chain name="mainFlow">
  2.     THEN(prepare, SUB(orderProcess), notify);
  3. </chain>
复制代码
组件降级处理
  1. import com.yomahub.liteflow.core.NodeComponent;
  2. import org.noear.solon.annotation.Managed;
  3. @Managed("paymentAction")
  4. public class PaymentAction extends NodeComponent {
  5.     @Inject
  6.     FallbackService fallbackService;
  7.    
  8.     @Override
  9.     public void process() {...}
  10.     @Override
  11.     public void onError() {
  12.         // 支付失败时执行补偿逻辑
  13.         fallbackService.compensate();
  14.     }
  15. }
复制代码
规则热更新
  1. import com.yomahub.liteflow.flow.FlowBus;
  2. import org.noear.solon.annotation.Managed;
  3. import org.noear.solon.core.bean.LifecycleBean;
  4. // 动态添加规则
  5. FlowBus.addChain("newChain", "THEN(a,b,c)");
  6. // 监听规则变化
  7. @Managed
  8. public class FlowConfig implements LifecycleBean {
  9.     @Override
  10.     public void postStart() throws Throwable {
  11.         FileWatcher.watch(Paths.get("config/flow"),
  12.                 () -> FlowBus.reloadRule());
  13.     }
  14. }
复制代码
四、监控与调试

流程跟踪
  1. LiteflowResponse response = flowExecutor.execute2Resp(
  2.     "orderProcess",
  3.     context,
  4.     OrderContext.class,
  5.     // 开启执行链路跟踪
  6.     SlotCallbackBuilder.builder().build()
  7. );
  8. System.out.println(response.getExecuteStepStr());
复制代码
输出示例:initOrder[✓] => checkInventory[✓] => checkUserCredit[✓] => ...
可视化监控(需企业版)
  1. liteflow:
  2.   monitor:
  3.     enable-log: true
  4.     queue-limit: 200
  5.     delay: 30
  6.     period: 120
复制代码
五、最佳实践建议

上下文设计原则


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


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


  • 业务异常通过 throw BusinessException 中断流程
  • 系统异常自动触发 onError 回调
规则管理进阶
  1. // 从数据库加载规则
  2. @Managed
  3. public class DBRuleLoader implements RuleSource {
  4.     @Override
  5.     public String loadRules() {
  6.         return ruleMapper.selectByApp("order-service");
  7.     }
  8. }
复制代码
结语

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

  • 业务可视化编排:复杂流程通过EL表达式清晰定义
  • 组件热插拔:新增业务节点无需停服
  • 极致性能:单机万级TPS满足高并发场景
  • 灵活扩展:支持自定义节点、拦截器、上下文
在微服务架构下,LiteFlow 的轻量级特性使其成为业务流程编排的理想选择。其简洁的API设计让开发者能快速上手,而强大的异步并行、嵌套流程等特性又能支撑复杂业务场景。

来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册