flowable-devops/docs/99-最终修正落地方案.md
dengqichen d840effe9e 提交
2025-10-13 14:04:05 +08:00

98 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 最终修正落地方案PM + 架构联合稿)
版本: v1.0
适用范围: 替代/修正 docs/01、docs/02、docs/03 中的关键设计,统一数据库为 MySQL 8.0,并固化 MVP 可落地路径。
一、产品与范围MVP
- 目标可视化工作流平台支持编辑器ReactFlow、节点配置动态表单/字段映射/表达式)、执行、审批。
- 明确不做MVP并行/子流程、定时/Webhook 触发、版本管理、多租户、复杂鉴权/监控、插件市场、AI 辅助。
- 闭环路径:前端构建 JSON → 后端转 BPMN含条件分支部署到 Flowable → 同步执行(审批点暂停并恢复)→ 执行/日志/任务可查询。
二、关键技术决策(统一口径)
- 数据库MySQL 8.0JSON 类型用于 definition/fields/output_schema/input/output 等),字符集 utf8mb4。
- 表达式:仅采用 Jakarta EL (JUEL)Map-only 访问,禁用类/方法反射调用;前端不直接执行表达式,仅做占位/静态提示(第二期可加后端沙箱预览)。
- 执行MVP 同步执行Flowable 全局异步执行器关闭async-executor-activate=false审批链路天然异步等待用户完成任务
- 条件分支JSON 模型以 edge.conditionJUEL 表达式)表示;转换层生成 ExclusiveGateway + 条件 SequenceFlow。
- 节点扩展Spring 插件化WorkflowNode 接口 + NodeTypeMetadata + outputSchemaNodeTypeRegistry 负责注册/查询。
- HTTP 客户端WebClientSpring WebFlux统一超时与重试策略不混用 MVC + WebFlux。
三、架构总览(修正摘要)
- 后端Spring Boot 3.2 + Flowable 7.0.1 + MySQL 8.0 + Redis 7 + Jakarta ELREST API/api/workflows、/api/node-types、/api/tasks
- 前端React 18 + TypeScript 5 + ReactFlow 11 + AntD 5 + Zustand + AxiosVite 构建。
- 部署Docker Composemysql:8、redis:7、backendNginx 反向代理(生产)。
四、后端落地清单
1) 依赖与配置
- POM 仅保留 spring-boot-starter-webflux移除 spring-boot-starter-web添加 jakarta.el 依赖;数据库驱动改为 mysql-connector-j。
- application.yml
- datasource.url=jdbc:mysql://.../workflow_db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
- driver=com.mysql.cj.jdbc.Driver
- flowable.async-executor-activate=falseMVP 同步)
2) DDLMySQL 8
- 将所有 JSONB 改为 JSON去除 ::jsonb 强制类型转换;示例插入用合法 JSON 字符串。
- 关键表:
- workflow_definitions(definition JSON, flowable_* 索引列保留)
- node_types(fields JSON, output_schema JSON)
- workflow_executions(input JSON)
- node_execution_logs(input JSON, output JSON)
3) Flowable 集成修正
- ServiceTask 使用 delegateExpression("${genericNodeExecutor}"),由 Spring 托管,保证 @Autowired 生效。
- GenericNodeExecutor 从 execution.getCurrentFlowElement() 的 FieldExtension 读取 nodeType/nodeConfig不再误用 execution 变量。
- WorkflowConverter
- 添加 ExclusiveGateway 与条件 SequenceFlow对 edge.condition 设置 conditionExpression。
- 保留 start→first 与 last→end 的连线(无条件)。
4) 表达式引擎JUEL - Jakarta EL
- import jakarta.el.*;构建 StandardELContext注入 nodes/workflow/env 三大命名空间。
- 缓存表达式编译结果LRU无 ${} 的字符串走快路径直接返回。
- 安全:黑名单不足以防御,辅以受限 ELResolver仅 Map/property 解析),禁用方法调用。
5) HTTP 节点
- 实现基于 WebClient连接/响应超时;可选重试(限定幂等方法)。
- 输入url/method/headers/body/timeout输出statusCode/body/headers/elapsed。
6) 观察性
- 写入 node_execution_logsstatus、input、output、错误、时长为 execution_id、status、时间建立索引。
- 审批与执行历史接口完成:执行详情包含各节点输入/输出摘要(注意脱敏)。
五、前端落地清单
- 字段映射:基于上游节点的 outputSchema 构建树;表达式值统一存储为“完整 ${...}”字符串。
- 表达式括号处理修复:使用正则 /^\$\{|\}$/g 去括号;选择时拼接为 `\${${val}}`
- Zustand统一管理 nodes/edges/selectedNode/currentWorkflow保存时构建规范化 JSON。
- 性能:节点组件 memo、事件节流避免使用不存在的 ReactFlow 属性。
六、API 与契约MVP 必备)
- /api/workflowscreate/update/get/list/delete/execute、getExecutions、getExecutionDetail。
- /api/node-typeslist/get/by-category返回 NodeTypeMetadata含 fields/outputSchema
- /api/taskslist/detail/complete/form审批流
- 错误码4xx校验/鉴权、5xx系统错误分页与筛选采用标准 query 参数。
七、验收标准MVP
- 功能:
- 场景 AHTTP → 审批 → 邮件,端到端成功;审批暂停与恢复链路可见。
- 场景 B条件分支生效200→邮件否则→另一分支
- 性能10 节点链路 < 500ms不含审批表达式评估基准 > 10k QPS画布 100+ 节点不卡顿。
- 质量:核心模块单测覆盖 > 60%E2E 场景跑通;关键事件与错误可观测。
八、两周 PoC 计划
- Week 1
- 完成 JSON→BPMNServiceTask + UserTask + ExclusiveGateway + 条件边)
- JUEL 上下文与缓存HTTP 节点WebClient
- NodeTypeRegistry 注册/查询node_types/definitions 基础表
- Week 2
- 审批任务 API列表/表单/完成);执行历史与节点日志入库
- 前端编辑器/配置面板/字段映射;审批中心
- 样例工作流 A/B 端到端自测并出基准数据
九、风险与缓解
- 转换层复杂以最小节点集HTTP/条件/变量/邮件/审批)完成 PoC随后逐步扩展。
- 表达式安全Map-only ELResolver + 严格长度/关键字校验;第二期引入后端沙箱预览接口。
- MySQL JSON 性能:关键查询加合适索引;大 JSON 字段只作存储与读取,不进行复杂查询。
十、后续演进(非 MVP
- 异步执行(队列/线程池/回调)、定时/Webhook 触发、循环/并行/子流程、工作流版本管理、更多节点库、监控大盘、权限与多租户、导入导出、AI 辅助。