LiteFlow 是一个国产的轻量级的 Java 流程编排框架,旨在简化复杂的业务逻辑处理流程。它通过定义节点和流程,将复杂的业务逻辑分解成多个可管理的部分,从而提高代码的可读性和可维护性。
今天松哥和大伙一起来聊下这个工具。
LiteFlow 是一个基于 Java 的流程编排框架,它允许开发者定义一系列的节点(Node)和流程(Flow),通过这些节点和流程来控制业务逻辑的执行顺序。LiteFlow 的核心思想是将复杂的业务逻辑分解成多个小的、可管理的部分,每个部分负责处理特定的任务。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
视频教程:https://doc.iocoder.cn/video/
如果你要对复杂业务逻辑进行新写或者重构,用LiteFlow最合适不过。它是一个编排式的规则引擎框架,组件编排,帮助解耦业务代码,让每一个业务片段都是一个组件。
利用 LiteFlow,你可以将瀑布流式的代码,转变成以组件为核心概念的代码结构,这种结构的好处是可以任意编排,组件与组件之间是解耦的,组件可以用脚本来定义,组件之间的流转全靠规则来驱动。LiteFlow 拥有开源规则引擎最为简单的 DSL 语法。十分钟就可上手。
而且这些组件可以实时热更替,也可以给编排好的逻辑流里实时增加一个组件,从而改变你的业务逻辑。
LiteFlow 适用于拥有复杂逻辑的业务,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度拆分成一个个独立的组件,进行装配复用变更。使用 LiteFlow,你会得到一个灵活度高,扩展性很强的系统。因为组件之间相互独立,也可以避免改一处而动全身的这样的风险。
LiteFlow 只做基于逻辑的流转,而不做基于角色任务的流转。如果你想做基于角色任务的流转的工作流,推荐使用 Flowable,
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/yudao-cloud
-
视频教程:https://doc.iocoder.cn/video/
假设我现在有一个用户下单的需求,下单步骤我简化成以下几个步骤:
-
-
库存检查:检查商品是否有足够的库存来满足订单需求。
-
价格确认:再次确认商品的价格,防止因促销活动结束等原因导致的价格变动。
-
创建订单:如果所有条件都满足,服务器会在数据库中创建一条新的订单记录。
-
支付处理:根据用户选择的支付方式进行相应的处理,比如跳转到第三方支付平台完成支付。
-
库存更新:一旦支付成功,更新商品的库存信息,减少已售出的商品数量。
-
订单确认:向用户发送订单确认信息,包括订单号、预计发货时间等。
其中 1、5 属于用户节点要完成的内容;2、6 属于库存节点要完成的内容;3 属于商品节点要完成的内容;4、7 则属于订单节点要完成的内容。
接下来我就通过 LiteFlow 来和小伙伴们演示如何完成上面的下单过程。
简单期间,我这里就和大家演示前 4 步的流程编排。
首先创建 SpringBoot 工程,引入 LiteFlow 依赖,如下:
<dependency>
<groupId>com.yomahubgroupId>
<artifactId>liteflow-spring-boot-starterartifactId>
<version>2.12.3version>
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 文件对这些流程进行编排:
<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
接口的时候,就会依次出发前面编排的四个服务。
我们可以定义一个条件选择组件,类似下面这样:
@LiteflowComponent("a")
public class ACmp extends NodeSwitchComponent {
@Override
public String processSwitch() throws Exception {
System.out.println("Acomp executed!");
return "c";