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