• LiteFlow 流程引擎


    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来保证线程安全。
    image.png
    类图如下,
    SLOTS是继承DataBus的
    1:SLOTS 是系统中正在执行的请求的slot的index 作为key,value就是solt,通过index来传递,保证在多线程的场景下也可以用。
    2:QUEUE 是一个取solt的工厂,请求开始,就会从QUEUE取一个号,然后初始化slot,放入SLOTS成员变量里面
    solt的类图如下:
    image.png

    • metaDataMap 维护一些请求元信息,key的话就是一些定义的常量
    • image.png

    FlowBus

    FlowBus主要是一些
    1:chainMap 是执行链维度的工厂
    2:nodeMap 所有节点的Node
    image.png

    流程逻辑实现

    以实现整个逻辑流程为例:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • WHEN 节点
    • THEN 节点
    • SWITCH 节点

    每种节点都会实现对应的Condition接口
    每个节点下又所有的所有执行节点,存放在executableList 中

    image.png
    最终通过Condition实现了一颗决策树
    image.png

    选择编排

    选择编排是通过SwitchCondition这个类来描述的。通过返回的节点名称或者id来跳转节点的。
    image.png
    通过switch节点执行,获取下个节点,然后继续后面的逻辑
    image.png

    并行编排

    并行执行,通过线程池执行。
    image.png

  • 相关阅读:
    STM32F407ZGT6|串口发送数据给上位机(定时)
    Xshell 常用命令大全手册
    代码随想录|583. 两个字符串的删除操作,72. 编辑距离(有进一步理解到)
    SpringSecurity - 启动流程分析(六)
    Redis6 十二:Redis中的事务
    golang RPC包的使用和源码学习(下):tinyrpc项目源码学习
    【BP-Adaboost预测】基于BP神经网络的Adaboost的单维时间序列预测研究(Matlab代码实现)
    世界杯网页梦幻联动.html
    Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。
    Operator开发之operator-sdk入门
  • 原文地址:https://blog.csdn.net/flw7758/article/details/126576421