LiteFlow 流程引擎
开源地址:https://gitee.com/dromara/liteFlow
文档:https://liteflow.yomahub.com/pages/724bc3/
公司也有类似框架,但是功能没有这么丰富,也算学习下设计吧。
适合那些场景
1:逻辑链路比较长,逻辑比较多的业务场景。
2:可以作为一个架构设计,贯穿到整个业务设计中,让业务更加解耦,代码可维护性更高。
上下文的传递
1:通过TreadLocal 传递,但是只能单线程,多线程节点处理比较复杂,无法拿到上下文。而且流程结束要及时清理上下文。不然导致bug,而且很难发现。
2:每次流程入口都通过创建上下文对象,这个模式简单,在流程编排比较简单时候,直接按照业务维护上下文。
但是面对复杂的流程编排的场景,上线文维护比较麻烦,而且不够优雅。
3:通过令牌桶机制,维护上下文。这也是liteflow采用的方式。
- DataBus
- NodeComponent(抽象类,所有的节点都需要继承这个抽象类,多继承场景??)
- Slot :存储上下文
Slot上下文
作用:每个请求都会有一个solt,solt 维护一个DataBus类然后通过queue来保证线程安全。
类图如下,
SLOTS是继承DataBus的
1:SLOTS 是系统中正在执行的请求的slot的index 作为key,value就是solt,通过index来传递,保证在多线程的场景下也可以用。
2:QUEUE 是一个取solt的工厂,请求开始,就会从QUEUE取一个号,然后初始化slot,放入SLOTS成员变量里面
solt的类图如下:
- metaDataMap 维护一些请求元信息,key的话就是一些定义的常量
FlowBus
FlowBus主要是一些
1:chainMap 是执行链维度的工厂
2:nodeMap 所有节点的Node
流程逻辑实现
以实现整个逻辑流程为例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BRKJacfg-1661702147591)(https://cdn.nlark.com/yuque/0/2022/svg/653872/1661697701020-9e577514-131a-475a-bc00-7ad2a0743dcb.svg#clientId=u664498d8-4613-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u6b954a95&margin=%5Bobject%20Object%5D&originHeight=449&originWidth=1050&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u37d3169f-b267-4c95-8983-2fcc08dfed3&title=)]
整个流程表示式:
<chain name="chain1_1">
THEN(
A,
WHEN(
THEN(B, C),
THEN(D, E, F),
THEN(
SWITCH(G).to(
THEN(H, I, WHEN(J, K)).id("t1"),
THEN(L, M).id("t2")
),
N
)
),
Z
);
</chain>
- WHEN 节点
- THEN 节点
- SWITCH 节点
每种节点都会实现对应的Condition接口
每个节点下又所有的所有执行节点,存放在executableList 中
最终通过Condition实现了一颗决策树
选择编排
选择编排是通过SwitchCondition
这个类来描述的。通过返回的节点名称或者id
来跳转节点的。
通过switch节点执行,获取下个节点,然后继续后面的逻辑
并行编排
并行执行,通过线程池执行。