⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 江南一点雨 「江南一点雨」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

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

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

一 什么是 LiteFlow

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

二 为什么需要 LiteFlow

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

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

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

2.1 LiteFlow 适用场景

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

2.2 LiteFlow 不适用场景

LiteFlow 只做基于逻辑的流转,而不做基于角色任务的流转。如果你想做基于角色任务的流转的工作流,推荐使用 Flowable,

三 LiteFlow 实践

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

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

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

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

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

3.1 基本用法

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

<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.12.3</version>
</dependency>

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

@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 version="1.0" encoding="UTF-8"?>
<flow>
<chain name="orderProcessChain">
THEN(userNode, storageNode, merchandiseNode, orderNode);
</chain>
</flow>

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

liteflow.rule-source=classpath:liteflow.xml

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

/**
* @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 条件选择

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

@LiteflowComponent("a")
public class ACmp extends NodeSwitchComponent {

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

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

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

<chain name="chain1">
SWITCH(a).to(b, c);
</chain>

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

3.3 循环

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

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

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

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

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

<chain name="chain1">
FOR(f).DO(THEN(a, b));
</chain>

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

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

四 小结

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

文章目录
  1. 1. 一 什么是 LiteFlow
  2. 2. 二 为什么需要 LiteFlow
    1. 2.1. 2.1 LiteFlow 适用场景
    2. 2.2. 2.2 LiteFlow 不适用场景
  3. 3. 三 LiteFlow 实践
    1. 3.1. 3.1 基本用法
    2. 3.2. 3.2 条件选择
    3. 3.3. 3.3 循环
  4. 4. 四 小结