Spring Boot3集成 LiteFlow 实现业务流程编排

@[toc] LiteFlow 是一个国产的轻量级的 Java 流程编排框架,旨在简化复杂的业务逻辑处理流程。它通过定义节点和流程,将复杂的业务逻辑分解成多个可管理的部分,从而提高代码的可读性和可维护性。

今天松哥和大伙一起来聊下这个工具。

一 什么是 LiteFlow

LiteFlow 是一个基于 Java 的流程编排框架,它允许开发者定义一系列的节点(Node)和流程(Flow),通过这些节点和流程来控制业务逻辑的执行顺序。LiteFlow 的核心思想是将复杂的业务逻辑分解成多个小的、可管理的部分,每个部分负责处理特定的任务。

二 为什么需要 LiteFlow

如果你要对复杂业务逻辑进行新写或者重构,用LiteFlow最合适不过。它是一个编排式的规则引擎框架,组件编排,帮助解耦业务代码,让每一个业务片段都是一个组件。

利用 LiteFlow,你可以将瀑布流式的代码,转变成以组件为核心概念的代码结构,这种结构的好处是可以任意编排,组件与组件之间是解耦的,组件可以用脚本来定义,组件之间的流转全靠规则来驱动。LiteFlow 拥有开源规则引擎最为简单的 DSL 语法。十分钟就可上手。

而且这些组件可以实时热更替,也可以给编排好的逻辑流里实时增加一个组件,从而改变你的业务逻辑。

2.1 LiteFlow 适用场景

LiteFlow 适用于拥有复杂逻辑的业务,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度拆分成一个个独立的组件,进行装配复用变更。使用 LiteFlow,你会得到一个灵活度高,扩展性很强的系统。因为组件之间相互独立,也可以避免改一处而动全身的这样的风险。

2.2 LiteFlow 不适用场景

LiteFlow 只做基于逻辑的流转,而不做基于角色任务的流转。如果你想做基于角色任务的流转的工作流,推荐使用 Flowable,可以参考松哥的 TienChin 项目:TienChin 项目实战

三 LiteFlow 实践

假设我现在有一个用户下单的需求,下单步骤我简化成以下几个步骤:

  1. 身份验证:验证用户的身份信息,确保操作的安全性。
  2. 库存检查:检查商品是否有足够的库存来满足订单需求。
  3. 价格确认:再次确认商品的价格,防止因促销活动结束等原因导致的价格变动。
  4. 创建订单:如果所有条件都满足,服务器会在数据库中创建一条新的订单记录。
  5. 支付处理:根据用户选择的支付方式进行相应的处理,比如跳转到第三方支付平台完成支付。
  6. 库存更新:一旦支付成功,更新商品的库存信息,减少已售出的商品数量。
  7. 订单确认:向用户发送订单确认信息,包括订单号、预计发货时间等。

其中 1、5 属于用户节点要完成的内容;2、6 属于库存节点要完成的内容;3 属于商品节点要完成的内容;4、7 则属于订单节点要完成的内容。

接下来我就通过 LiteFlow 来和小伙伴们演示如何完成上面的下单过程。

简单期间,我这里就和大家演示前 4 步的流程编排。

3.1 基本用法

首先创建 SpringBoot 工程,引入 LiteFlow 依赖,如下:

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

接下来我们根据前面分析的业务逻辑,创建四个不同的业务节点:

java 复制代码
@Component
public class UserNode extends NodeComponent {
    @Override
    public void process() {
        System.out.println("用户身份验证");
    }
}
@Component
public class StorageNode extends NodeComponent {
    @Override
    public void process() {
        System.out.println("库存检查");
    }
}
@Component
public class MerchandiseNode extends NodeComponent {
    @Override
    public void process() {
        System.out.println("价格确认");
    }
}
@Component
public class OrderNode extends NodeComponent {
    @Override
    public void process() {
        System.out.println("订单确认");
    }
}

然后在 classpath 下定义 liteflow.xml 文件对这些流程进行编排:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<flow>
    <chain name="orderProcessChain">
        THEN(userNode, storageNode, merchandiseNode, orderNode);
    </chain>
</flow>

接下来在 application.properties 中加载这个 xml 文件,如下:

properties 复制代码
liteflow.rule-source=classpath:liteflow.xml

接下来就可以使用这个流程了,如下:

java 复制代码
/**
 * @author:江南一点雨
 * @site:http://www.javaboy.org
 * @微信公众号:江南一点雨
 * @github:https://github.com/lenve
 * @gitee:https://gitee.com/lenve
 */
@RestController
public class HelloController {

    @Autowired
    FlowExecutor flowExecutor;
    @GetMapping("/hello")
    public void hello() {
        flowExecutor.execute2Resp("orderProcessChain");
    }
}

当我们调用 /hello 接口的时候,就会依次出发前面编排的四个服务。

3.2 条件选择

我们可以定义一个条件选择组件,类似下面这样:

java 复制代码
@LiteflowComponent("a")
public class ACmp extends NodeSwitchComponent {

    @Override
    public String processSwitch() throws Exception {
        System.out.println("Acomp executed!");
        return "c";
    }
}

这个方法需要返回 String 类型,就是具体的结果,上面代码示例了选择到了 c 节点。

这个时候我们定义 xml 内容如下:

xml 复制代码
<chain name="chain1">
    SWITCH(a).to(b, c);
</chain>

这就表示先在 a 中做选择,根据 a 中 processSwitch 方法的返回值,决定去执行 b 还是 c。

3.3 循环

LiteFlow 提供了次数循环组件。返回的是一个 int 值的循环次数。 主要用于 FOR...DO... 表达式。

循环组件的定义类似下面这样:

java 复制代码
@LiteflowComponent("f")
public class FCmp extends NodeForComponent {
    @Override
    public int processFor() throws Exception {
        //这里根据业务去返回for的结果
    }
}

循环多少次,就看方法的返回值了。

然后定义 xml 文件类似下面这样:

xml 复制代码
<chain name="chain1">
    FOR(f).DO(THEN(a, b));
</chain>

我觉得这块可以改进下,没必要定义类,直接在 XML 文件中用表达式去描述 FOR 会更好一些。

另外 LiteFlow 也支持迭代、boolean 等组件,也不难,感兴趣的小伙伴可以去看下文档。

四 小结

LiteFlow 是一个强大的流程编排框架,它可以帮助开发者简化复杂的业务逻辑处理。通过定义节点和流程,LiteFlow 使得代码更加模块化和易于管理。无论是简单的任务调度还是复杂的业务流程自动化,LiteFlow 都能提供有效的解决方案。

公众号后台回复 LiteFlow 可以下载本文完整案例。

相关推荐
Z_z在努力3 分钟前
【杂类】Spring 自动装配原理
java·spring·mybatis
程序员爱钓鱼14 分钟前
Go语言实战案例-开发一个Markdown转HTML工具
前端·后端·go
小小菜鸡ing30 分钟前
pymysql
java·服务器·数据库
getapi33 分钟前
shareId 的产生与传递链路
java
桦说编程43 分钟前
爆赞!完全认同!《软件设计的哲学》这本书深得我心
后端
thinktik1 小时前
还在手把手教AI写代码么? 让你的AWS Kiro AI IDE直接读飞书需求文档给你打工吧!
后端·serverless·aws
我没想到原来他们都是一堆坏人2 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
沙二原住民2 小时前
提升数据库性能的秘密武器:深入解析慢查询、连接池与Druid监控
java·数据库·oracle
上官浩仁2 小时前
springboot redisson 缓存入门与实战
spring boot·redis·缓存