本次从入门到实战,我们选用了若依plus、JDK17以及SpringBoot 3.4.1这一组合技术栈,这几款最新版本搭配运行,效率表现非常出色。
接下来介绍本文的主角:Tinyflow。目前市面上工作流组件种类繁多,但Tinyflow的独特优势在于同时支持Java前端与后端——后端只需引入依赖,前端则可兼容Vue或React。其设计理念与Dify、Coze的工作流高度相似,核心功能包括智能体编排,并支持自定义节点。这一特性在实际开发中至关重要,因为业务场景往往无法被标准化流程完全覆盖。
此外,Spring AI Alibaba也在推进类似功能,基于Spring AI Alibaba Graph实现,但客观来说,目前仍处于完善阶段,生产环境建议优先考虑Tinyflow。
好,闲话少叙,下面直接进入实战环节。
demo版
项目成功启动后,通过浏览器访问“https://localhost:port”即可看到界面。在页面上新增节点,随后点击运行测试。测试通过后,再点击保存。检查数据库,即可看到数据已被成功插入——整个流程完整跑通。
接下来,我们查看运行过程中生成的JSON结构:
{"nodes":[{"id":"node_CVKeWeJL8jn5cGr4","position":{"x":-83,"y":67},"data":{"title":"开始节点","description":"开始定义输入参数","expand":true,"parameters":[{"name":"username","dataType":"String","refType":"input","id":"YtkNFKFFC5hh4zAh","required":true},{"name":"password","dataType":"String","refType":"input","id":"YW0JonLnPtsDVRlp","required":true}]},"type":"startNode","selected":false,"measured":{"width":305,"height":238},"dragging":false},{"id":"node_Lmg446ujJkBFTq7s","position":{"x":333,"y":68},"data":{"title":"结束节点","description":"结束定义输出参数","expand":true,"outputDefs":[{"name":"用户名","dataType":"String","refType":"ref","id":"0FqjBTXWXwmNHvOm","ref":"node_CVKeWeJL8jn5cGr4.username"},{"name":"密码","dataType":"String","refType":"ref","id":"jdXNtiAiLAqP1uto","ref":"node_CVKeWeJL8jn5cGr4.password"}]},"type":"endNode","selected":true,"measured":{"width":368,"height":238},"dragging":false}],"edges":[{"markerEnd":{"type":"arrowclosed","width":20,"height":20},"source":"node_CVKeWeJL8jn5cGr4","target":"node_Lmg446ujJkBFTq7s","id":"p1QfMcJuAkHG9XN7","selected":false}],"viewport":{"x":269.9146606773976,"y":109.93970251055521,"zoom":0.8705505632961242}}
该JSON结构清晰完整,开始节点定义了输入参数(username和password),结束节点引用了这些参数作为输出,中间通过一条边连接,构成了简明的工作流骨架。
在实际操作中,我们将其拆分为七个步骤。步骤虽多,但每个环节都不复杂,下面逐一讲解。
第一步:引入依赖
首先在pom.xml中定义版本号:
<tinyflow.version>1.0.8tinyflow.version>
接着引入核心依赖:
<dependency><groupId>dev.tinyflowgroupId><artifactId>tinyflow-ja va-coreartifactId><version>${tinyflow.version}version>dependency>
第二步:表设计
我们需要创建一张表来存储流程数据。这里定义了ai_workflow表,包含流程ID、名称、节点数据、状态、描述等基础字段,同时预留了租户ID、部门、创建者等通用字段,便于后续业务扩展:
CREATETABLE`ai_workflow` ( `flow_id`bigintNOTNULLCOMMENT'流程id', `flow_name`varchar(50)DEFAULTNULLCOMMENT'流程名称', `graph` jsonDEFAULTNULLCOMMENT'节点数据', `status`intDEFAULT'0'COMMENT'状态 0->草稿 1->发布', `description`varchar(255)DEFAULTNULLCOMMENT'描述内容', `tenant_id`varchar(20)DEFAULTNULLCOMMENT'租户id', `create_dept`bigintDEFAULTNULLCOMMENT'创建部门', `create_by`bigintDEFAULTNULLCOMMENT'创建者', `create_time` datetimeDEFAULTNULLCOMMENT'创建时间', `update_by`bigintDEFAULTNULLCOMMENT'更新者', `update_time` datetimeDEFAULTNULLCOMMENT'更新时间', `del_flag`char(1)DEFAULT'0'COMMENT'删除标志(0代表存在 2代表删除)',PRIMARYKEY (`flow_id`)) COMMENT='AI流程编排';
第三步:代码生成
这一步最为便捷。直接使用代码生成器,将对应的Controller、Service、Mapper一键生成,然后拷贝到项目对应目录即可,无需手动编写任何基础的CRUD代码。
第四步:执行流程接口
在控制器层定义了一个/excute接口,接收AiWorkflowExcuteBo参数,调用Service执行流程。实现层目前先保留一个壳子,具体执行逻辑可根据业务需求后续填充。
@PostMapping("/excute")publicR
第五步:保存结果接口
流程执行完成后,需要将结果持久化。该接口与前面的执行接口设计思路一致,功能侧重点在于保存。
/*** 保存结果**@parambo*@return*/ @PostMapping("/sa veResult") publicR
第六步:发布流程接口
流程从草稿状态变为已发布状态,需要单独的接口触发。这里使用PUT方法,仅需传递流程ID即可。
/** * 发布流程 * *@paramflowId 流程id *@return */@PutMapping("/release/{flowId}")publicR
第七步:功能测试
至此,基本接口已经齐备。测试时,依次验证以下接口:查询接口、流程详情接口、新增接口、修改接口、删除接口、执行流程接口、保存结果接口、发布流程接口。最后检查数据库表,确认数据是否写入成功,各字段是否正常。
至此,Tinyflow结合若依plus的AI流程编排已完整跑通。从手动引入依赖、设计库表、生成代码,到定义核心的执行、保存、发布接口,再到最终测试验证——整个流程梳理下来,相信你对工作流在业务中的落地方式有了直观认识。接下来,可以根据实际业务场景添加自定义节点,让该框架真正服务于业务需求。
