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

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

一、LiteFlow核心优势

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

二、Solon 集成实战

准备:添加依赖包

xml 复制代码
<!-- 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 {
    @Override
    public void process() {
        PaymentContext context = this.getContextBean(PaymentContext.class);
        // 执行支付逻辑
        System.out.println("处理支付, 订单:" + context.getOrderId());
    }
}

// 条件组件示例(用于分支判断)
@Managed("userCheck")
public class UserCheck extends NodeComponent {
    @Override
    public void process() {
        UserContext context = this.getContextBean(UserContext.class);
        if(context.isVip()) {
            this.setIsEnd(true);  // 终止流程
        }
    }
}

步骤2:配置流程规则

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

yaml 复制代码
liteflow:
  rule-source: config/flow.el.xml

resources/config/flow.el.xml

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:初始化上下文并执行流程

java 复制代码
import com.yomahub.liteflow.core.FlowExecutor;
import com.yomahub.liteflow.flow.LiteflowResponse;
import org.noear.solon.annotation.*;

@Controller
public class OrderController {

    @Inject
    private 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() ? "订单成功" : "流程失败";
    }
}

三、高级特性应用

异步并行执行

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

嵌套子流程

xml 复制代码
<chain name="mainFlow">
    THEN(prepare, SUB(orderProcess), notify);
</chain>

组件降级处理

java 复制代码
import com.yomahub.liteflow.core.NodeComponent;
import org.noear.solon.annotation.Managed;

@Managed("paymentAction")
public class PaymentAction extends NodeComponent {
    @Inject
    FallbackService fallbackService;
    
    @Override
    public void process() {...}

    @Override
    public void onError() {
        // 支付失败时执行补偿逻辑
        fallbackService.compensate();
    }
}

规则热更新

java 复制代码
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 {
    @Override
    public void postStart() throws Throwable {
        FileWatcher.watch(Paths.get("config/flow"),
                () -> FlowBus.reloadRule());
    }
}

四、监控与调试

流程跟踪

java 复制代码
LiteflowResponse response = flowExecutor.execute2Resp(
    "orderProcess", 
    context, 
    OrderContext.class,
    // 开启执行链路跟踪
    SlotCallbackBuilder.builder().build()
);

System.out.println(response.getExecuteStepStr());

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

可视化监控(需企业版)

yaml 复制代码
liteflow:
  monitor:
    enable-log: true
    queue-limit: 200
    delay: 30
    period: 120

五、最佳实践建议

上下文设计原则

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

组件规范

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

异常处理

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

规则管理进阶

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

结语

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

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

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

相关推荐
架构师沉默12 分钟前
让我们一起用 DDD,构建更美好的软件世界!
java·后端·架构
胖头鱼不吃鱼-18 分钟前
Go 原理之 GMP 并发调度模型
java·jvm·golang
JosieBook26 分钟前
【IDEA】idea怎么修改注册的用户名称?
java·intellij-idea·策略模式
tuokuac1 小时前
创建的springboot工程java文件夹下还是文件夹而不是包
java·spring boot·后端
码界奇点1 小时前
Java同步锁性能优化:15个高效实践与深度解析
java·开发语言·性能优化·java-ee·同态加密
积极向上的zzz1 小时前
java中一些数据结构的转换
java·开发语言·数据结构
千睢1 小时前
JAVA中的反射
java·开发语言
Hejjon2 小时前
携带参数的表单文件上传 axios, SpringBoot
java·spring boot·后端
典孝赢麻崩乐急2 小时前
Java学习-----JVM的垃圾回收算法
java·jvm·学习
你不困我困2 小时前
异步通讯组件MQ
java