Turbo开源流程引擎 + LogicFlow环境搭建

Turbogithub.com/didi/turbo)是一个开源的轻量级的流程引擎,和传统的工作流引擎(如Activiti、flowable等)相比,Turbo更加简单易懂,学习成本更低,更加适用于一些小型的项目。如果你的项目需要做流程服务设计、低代码设计以及流程编排、工作流等,Turbo或许是你一个新的选择。

LogicFlowgithub.com/didi/LogicF...)是专注于业务流程图可视化的前端框架,且它和Turbo一样来自于滴滴的一个团队,可以说它们两个渊源颇深。LogicFlow可以为Turbo提供专业的前端框架,帮助我们快速绘制流程图,让我们避免了手写流图的麻烦;虽然在开源内容上, Turbo和LogicFlow的还没有磨合的那么好,但以后绝对会成为一对优秀的CP;

本文主要介绍一下,如何使用Turbo,以及如何使用LogicFlow来绘制流程图;在此之前,可以先从github的介绍中简单认识下Turbo;

目标

搭建Turbo + LogicFlow 环境,了解Turbo运作机制。

难度

环境要求

后端:

  • JDK 8 (JDK17 暂未适配)
  • Git
  • Maven

前端:

  • Node

部署Turbo

1、拉取测试工程代码

因为Turbo是以sdk的形式提供的,所以要想使用Turbo,我们应将其嵌入到对应工程中。在这里可以提前拉取示例工程:github.com/lthaoshao/t...

css 复制代码
git clone --depth=1 --branch main https://github.com/lthaoshao/turbo-example.git

2、项目结构介绍

项目做了一个的

css 复制代码
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── didiglobal
    │   │           └── turbo
    │   │               └── example
    │   │                   ├── TurboExampleApplication.java
    │   │                   ├── common
    │   │                   ├── config
    │   │                   ├── controller
    │   │                   ├── exception
    │   │                   ├── service
    │   │                   ├── util
    │   │                   └── vo
    │   └── resources
    │       ├── application-h2.yml    # 测试时直接运行,省去建库建表操作
    │       ├── application-mysql.yml
    │       ├── application.yml
    │       ├── static
    │       │   └── db
    │       │       ├── turbo-dml.sql
    │       │       ├── turbo-h2-ddl.sql
    │       │       └── turbo-mysql.sql
    │       └── templates

3、配置数据库

  • h2数据库

为了方便流程展示和执行,采用h2内存数据库,可以在不配置的情况下,直接体验;

  • MySQL数据库

如果应用于线上,需要配置对应是MySQL数据库;

  • 其他数据库

当前对于其他数据库暂时未做验证。由于使用了mybatis-plus,理论上可以支持,但是因为存在一些手写SQL(暂未优化),可能存在问题,使用时需要验证;

4、启动项目

bash 复制代码
# git clone --depth=1 --branch main https://github.com/lthaoshao/turbo-example.git
cd turbo-example
sh ./run.sh

部署LogicFlow

由于Logicflow默认的数据格式和Turbo默认的数据格式存在一定差异。所以我们需要使用TurboAdapter来实现将Logicflow的数据格式与Turbo数据格式的相互转换。见:github.com/Logic-Flow/...

启动LogicFlow需要有node环境,如果没有,需要先行安装node环境。另外,前端直接访问turbo-example的接口,所以需要先启动turbo服务。

启动命令

bash 复制代码
# clone 代码
git clone --depth=1 --branch master https://github.com/Logic-Flow/turbo-client.git
cd turbo-client
# 启动前端
npm install
npm run dev
# 查看运行日志
# tail -f target/business.log

访问地址可以在启动后谁出在控制台,如:http://localhost:9095/

绘制流程图

在turbo的代码中,已经预置了两个流程,可以作为参考;使用时可创建新的流程图,尝试绘制;

1、新建流程

2、绘制流程

当前画布只支持了 开始节点、用户任务节点、排他网关节点(条件判断)和结束节点,主要和turbo做了对应。两个节点之间的连线箭头,我们称之为顺序流,用于表示流程的走向。

双击顺序流,可以设置判断条件。当前turbo中支持groovy条件表达式,其中的变量是在执行过程中传递的。

3、保存和发布流程

流程编辑完成后, 可以选择保存和发布,发布后可以用于执行验证;

注意:在turbo-example中使用h2时,新绘制的流程不会被永久存储,在服务重启后会消失。

执行流程

turbo的示例工程中通过接口对外提供了几个API,这些API基本上都是直接依赖于Turbo引擎的。参考:com.didiglobal.turbo.example.controller.FlowRuntimeController

另外,为了能更快速的体验Turbo引擎的执行过程, 示例工程中添加了测试的代码,完成了整个执行。测试地址: http://localhost:8080/test/execute

流程的执行过程主要分为了几个阶段:

  • 创建流程实例(createInstance)
    • 此时引擎会生成一条流程实例,并开始执行流程,当遇到用户任务节点或者结束节点时,会停下来。
    • 遇到用户节点,会挂起任务,等待下一次操作。你可以在此时,完成一些业务逻辑。
  • 提交任务(commitTask)
    • 当"用户"完成一系列操作后,可以提交任务,继续驱动流程进行。这个任务可以是展示页面操作,也可以是系统操作,比较自由。
    • 流程驱动时,如果节点后出现多个分支,则会去寻找唯一的出口。如果在顺序流节点上配置了表达式,那么我们也会计算表达式,根据计算结果来确认是否走这条路径。
    • 同样的,如果再次遇到用户任务节点,则会循环这个操作,直到流程结束;
  • 回滚任务(rollbackTask)
    • 如果用户提交后,想要退回到上一个用户任务节点,则可以操作回滚来完成。回滚操作属于一个逆向操作,在流程中,是非必须的。
  • 流程终止(terminateProcess)
    • 除了以上操作,还有终止操作,这个操作是为了快速终止流程执行。

详细内容见,github.com/didi/turbo

常见问题

1. 是否支持Oracle数据库?

对于MySQL之外的数据库暂时未做验证。由于使用了mybatis-plus,理论上可以支持,但是因为存在一些手写SQL(暂未优化),可能存在问题,使用时需要验证一下,后续也会对这块进行优化。

2. 启动时报循环依赖错误

由于SpringBoot 高版本关闭了循环依赖的默认支持,如果存在循环依赖会拒绝启动 可以添加 spring.main.allow-circular-references=true 来开启支持循环依赖

用户任务节点怎么和业务关联?

在模型的节点属性中,有一个 properties ,其中可以放一些和业务相关的内容,比如和表单、任务id、api关联等等。这些内容会存入模型,在执行时遇到用户节点,会在接口的响应中体现。(ps:当前logicflow-client中,暂时没添加这块的绑定功能)

3. 是否支持SpringBoot 3.x ?

目前官方尚未对SpringBoot3的版本进行适配,相信后期很快会出的。

4. 是否支持JDK17 ?

目前官方尚未对JDK17的版本进行适配,相信后期很快会出的。

5.如何参与turbo的交流?

添加微信号:logic-flow,说明加入turbo用户群即可。

相关推荐
WongLeer几秒前
Go + GORM 多级分类实现方案对比:内存建树、循环查询与 Preload
开发语言·后端·mysql·golang·gorm
Victor3567 分钟前
Hibernate(34)Hibernate的别名(Alias)是什么?
后端
superman超哥10 分钟前
Rust HashMap的哈希算法与冲突解决:高性能关联容器的内部机制
开发语言·后端·rust·哈希算法·编程语言·冲突解决·rust hashmap
Victor35613 分钟前
Hibernate(33) Hibernate的投影(Projections)是什么?
后端
a程序小傲14 分钟前
【Node】单线程的Node.js为什么可以实现多线程?
java·数据库·后端·面试·node.js
奋进的芋圆9 小时前
DataSyncManager 详解与 Spring Boot 迁移指南
java·spring boot·后端
计算机程序设计小李同学9 小时前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
Echo娴10 小时前
Spring的开发步骤
java·后端·spring
追逐时光者10 小时前
TIOBE 公布 C# 是 2025 年度编程语言
后端·.net