作者:用户提供草稿 整理时间:2026-03-30 10:57:36 CST 来源:用户提供长文草稿 主题:把序列图重新理解为“一次具体请求的动态轨迹”,并给出判断场景、筛选角色、组织主链路与补充异常分支的一套实用方法。 配图:本文补充了 2 张结构化插图,用于可视化“序列图真正回答的问题”与“可复用的六步提问法”。
核心结论
序列图不是在画“系统里有哪些组件”,而是在画:
一次具体请求,是怎样按时间顺序在不同角色之间流转并完成的。
它回答的核心问题只有一个:
谁在什么时刻,调用了谁,做了什么,最后怎么返回。
所以,序列图的本质不是“静态结构展示”,而是“动态交互展开”。
如果把架构图理解为“地图”,那么序列图更像是:
一段请求在系统中的行走轨迹。
序列图最容易画偏的根源,不是不会画,而是没先想清楚“这张图到底在回答什么问题”
很多人画序列图时,一上来就堆组件、连箭头,最后图越画越乱。 根本原因通常不是工具不会,而是没有先限定场景。
序列图一次只应该讲清楚一个具体场景,例如:
- 用户登录
- 查询客户信息
- 提交订单
- 支付回调
- 调用大模型生成报告
- 审批流程发起
一张图里如果同时混入“登录、注册、找回密码”,或者“查询、修改、同步、回调”,就很容易失控。
序列图最重要的第一步,不是画,而是先用一句话定义:
这张图到底在描述哪一次交互。
理解序列图,先抓住两个维度:横向看角色,纵向看时间
序列图之所以比流程图更适合表达系统调用,是因为它天然把两件事同时展开了:
横向:有哪些参与者
也就是这次交互里,真正参与调用的对象是谁。 常见包括:
- 用户
- 前端
- API 网关
- 认证服务
- 业务服务
- Redis
- MySQL
- MQ
- ESB
- 第三方系统
- 文件服务
纵向:时间是如何推进的
从上到下,就是事件发生的先后顺序。
所以读序列图时可以始终用一句话去理解:
左边看谁参与,下面看谁先谁后。
序列图里最核心的,不是符号本身,而是“调用关系”与“分支条件”
初学时不需要记太多 UML 术语,先抓住最常用的几个元素就够了。
参与者
图顶端一列一个,表示本次交互里的角色。
消息箭头
表示谁调用了谁。 箭头方向非常关键:
谁发起调用,箭头就从谁指向谁。
返回结果
表示调用结束后结果返回。很多工具里会用虚线表示。 但不是每个返回都必须画,通常只画关键返回。
激活条
表示某个参与者正在处理任务。 这是增强可读性的手段,不是初学阶段的重点。
条件分支、循环、异常
这是序列图真正开始接近现实系统的地方。 现实系统很少是一路直线跑到底,往往包含:
- 缓存命中 / 未命中
- Token 有效 / 无效
- 数据存在 / 不存在
- 库存充足 / 不足
- 成功 / 失败
- 超时 / 重试
没有这些分支,图就容易显得过于理想化。
判断一张序列图有没有画对,关键不在“全不全”,而在“准不准”
很多人以为图里画得越多越专业,其实恰恰相反。
好的序列图不是“把所有组件都画进去”,而是:
只保留这次交互真正需要的角色。
例如用户查询一个业务数据,真正重要的可能是:
- 前端
- 网关
- 认证服务
- 业务服务
- Redis
- MySQL
- 外部系统
而不是把 Nacos、K8s、Prometheus、日志平台、CI/CD 都强行塞进来。
序列图的价值不在于“系统全景”,而在于:
这次请求是如何真实运行的。
一张可用的序列图,通常都可以还原成一段很清晰的文字叙述
如果你没法先把流程说清楚,图大概率也画不清楚。
一个很实用的方法是: 在画图之前,先把场景写成 5 到 8 句话。
例如“用户查询客户报告”:
- 用户在前端点击查询
- 前端向网关发请求
- 网关先做认证校验
- 认证通过后把请求转给报告服务
- 报告服务先查 Redis
- 未命中则查 MySQL
- 必要时调用文件服务补充信息
- 结果回写缓存并返回前端
只要这几句话顺了,图基本就能顺着画出来。
所以真正稳妥的顺序永远是:
先写文字,再画箭头。
企业系统里的序列图,最常见的套路其实非常固定
很多业务场景虽然名字不同,但调用骨架非常相似。 常见模式大概就是这几层:
入口层
- 用户
- 前端
- API 网关
控制层
- 认证服务
- 权限校验
- 路由转发
业务层
- 订单服务
- 报告服务
- 授信服务
- 客户服务
资源层
- Redis
- MySQL
- MQ
- 文件服务
- 第三方系统
- ESB
也就是说,很多图本质上都是在回答:
一个外部请求进入系统后,如何穿过入口层、业务层和资源层,最后把结果带回来。
在企业系统里,最常见的一类序列图其实是“先认证,再执行业务,再按分层策略取数”
这是最值得形成套路感的地方。
以“查询客户授信信息”为例,常见链路就是:
- 用户在前端发起请求
- 前端带 Token 调用网关
- 网关调用认证服务校验身份
- 认证通过后,请求转给授信服务
- 授信服务先查 Redis
- Redis 未命中,再查本地 MySQL
- 本地数据不存在或失效,再通过 ESB 调用核心系统
- 核心系统返回结果
- 授信服务落库、回写缓存
- 结果逐层返回前端
这个模式其实能覆盖大量真实业务。
它背后的系统思想也很清晰:
- 能从缓存拿,就不要查库
- 能从本地库拿,就不要频繁打外部系统
- 实在没有,再走跨系统调用
这不是画图技巧,而是很多企业系统的真实运行逻辑。
Redis、MySQL、ESB、MQ 这些东西之所以常出现,不是因为它们“高级”,而是因为它们承担的角色不同
Redis 的意义是“快”
它通常承担的是热点数据缓存、临时状态保存、限流状态、会话信息等能力。
在序列图里,Redis 常常意味着:
系统在优先尝试更低成本、更高速度的取数方式。
MySQL 的意义是“准”
它通常是业务主数据的权威来源,是系统正式保存数据的地方。
在序列图里,MySQL 出现,通常代表:
系统开始触达持久化主数据。
ESB 的意义是“跨系统协同”
不是所有调用都要经过 ESB。 通常只有在跨域、跨系统、调用老系统/核心系统时,ESB 才会出现。
所以 ESB 是否该画,不取决于“企业里有没有 ESB”,而取决于:
这次交互是否真的经过了它。
MQ 的意义是“异步解耦”
很多主流程之外的事情,比如:
- 审计日志
- 消息通知
- 行为留痕
- 指标统计
- 后续异步任务
不适合同步阻塞主流程,就会交给 MQ。
所以在序列图里,MQ 往往意味着:
系统不是把所有事情都同步做完,而是在把主流程和旁路任务拆开。
Nacos、K8s、Nginx 这些东西不是不重要,而是大多数业务序列图里它们不是主角
这是一个很容易混淆的点。
很多人因为知道这些组件很重要,于是画图时总想加进去。 但要分清:
- 业务交互图画的是请求如何流转
- 部署架构图画的是服务如何部署与运行
- 基础设施图画的是底座能力如何支撑
所以:
- Nacos 主要是服务注册发现、配置管理
- Kubernetes 主要是容器调度与编排
- Nginx 往往属于入口接入层实现细节
它们当然很重要,但如果这张图描述的是“用户查询授信信息的业务调用链”,那它们通常不是主角。
也就是说:
不画它们,不代表它们不存在;只是这张图表达重点不在它们。
画序列图最稳的方法,不是追求一步到位,而是“先主流程,再补异常”
这是非常实战的一条经验。
很多人一开始就试图把所有异常、重试、回滚、超时、降级、幂等全塞进去,结果图直接爆掉。 更稳妥的方法是分两步:
第一步:先画成功主链路
只回答:
- 请求从哪来
- 经过谁
- 主业务谁处理
- 查了哪些资源
- 最后怎么返回
第二步:再补关键异常
例如:
- Token 失效
- 缓存未命中
- 数据不存在
- 外部接口失败
- 超时重试
- 库存不足
- 权限不足
这样画出来的图不仅更稳,也更容易给别人讲清楚。
一个真正能复用的思维模板,不是 Mermaid 语法模板,而是“六步提问法”
以后拿到任何一个功能场景,都可以先问自己这六个问题:
1. 谁发起请求
是用户、前端、第三方系统、定时任务,还是内部系统?
2. 请求先到哪
是前端、网关、ESB,还是某个接入层服务?
3. 谁是主处理服务
到底是认证服务、订单服务、报告服务,还是某个中台服务在执行业务主逻辑?
4. 它依赖哪些下游
是否要查 Redis、MySQL、文件服务、MQ、第三方系统、核心系统?
5. 中间有没有关键分支
例如认证通过/失败、缓存命中/未命中、本地有数据/无数据、下游成功/失败?
6. 最后怎么返回
是同步返回页面结果,还是发 MQ 异步处理,还是回调另一个系统?
只要这六个问题能回答清楚,图基本就能画出来。
适合用序列图表达的,不是“系统长什么样”,而是“系统怎么跑起来”
序列图特别适合以下场景:
- 登录认证
- 查询详情
- 提交订单
- 支付回调
- 文件上传
- 审批提交流程
- 第三方接口调用
- MQ 异步通知
- AI 调用链路
- 缓存读写流程
而如果你想表达的是:
- 整体系统结构
- 模块分层关系
- 状态迁移
- 完整业务流程节点
那很多时候用架构图、状态图、活动图、流程图会更合适。
所以可以记一句非常稳的话:
序列图专门回答“谁按什么顺序调用了谁”。
Mermaid 只是表达工具,真正决定图质量的是你是否抓住了“真实业务调用链”
Mermaid 很方便,因为它适合快速把逻辑写成图。 但要注意,Mermaid 只是载体,不是核心。
真正决定一张图是否好用的,不是:
- 配色漂不漂亮
- 是否用了激活条
- 箭头是否足够复杂
而是:
- 参与者是否真实
- 顺序是否准确
- 分支是否合理
- 抽象层级是否统一
- 这张图是否只讲清楚一件事
所以,序列图最终是工程思维问题,不是排版问题。
一个序列图高手和一个新手,真正的差别通常不在画法,而在抽象能力
新手常见问题是:
- 什么都想画
- 所有组件都想保留
- 一张图想解释整个系统
- 把业务问题、部署问题、基础设施问题混在一起
而更成熟的画法通常表现为:
- 一图一事
- 只保留本次交互真正相关的角色
- 主流程先清楚
- 异常补得适度
- 让别人能顺着图把故事讲出来
也就是说,真正好的序列图不是“复杂”,而是:
复杂系统中仍然保持表达克制。
一条很值得记住的判断标准:序列图画得好不好,看别人能不能顺着它把一次请求讲明白
如果别人看完你的图,能自然说出类似这样的话:
“用户从前端发请求到网关,网关先做认证,认证通过后转给业务服务,业务服务先查缓存,没命中再查库,必要时再走 ESB 调核心系统,最后把结果缓存并返回前端。”
那这张图大概率就是合格的。
如果别人看完只能说:
“这里有很多系统和箭头。”
那图就大概率没有真正讲清楚交互。
可直接复用的 Mermaid 基础模板
sequenceDiagram
participant U as 用户/调用方
participant F as 前端/调用系统
participant G as API网关
participant A as 认证服务
participant B as 业务服务
participant R as Redis
participant D as MySQL
participant E as ESB
participant X as 外部系统
participant M as MQ
U->>F: 发起业务请求
F->>G: 请求接口 + Token
G->>A: 校验身份/权限
alt 认证通过
A-->>G: 通过
G->>B: 转发业务请求
B->>R: 查询缓存
alt 缓存命中
R-->>B: 返回缓存结果
else 缓存未命中
R-->>B: 未命中
B->>D: 查询本地数据
alt 本地数据有效
D-->>B: 返回本地数据
else 本地无数据或失效
D-->>B: 无有效数据
B->>E: 调用ESB
E->>X: 调用外部系统
X-->>E: 返回结果
E-->>B: 返回标准化结果
B->>D: 保存/更新数据
D-->>B: 保存成功
end
B->>R: 回写缓存
R-->>B: 回写成功
end
B->>M: 发送异步消息/日志
M-->>B: 发送成功
B-->>G: 返回业务结果
G-->>F: 返回响应
F-->>U: 展示结果
else 认证失败
A-->>G: 拒绝访问
G-->>F: 返回未认证/无权限
F-->>U: 提示失败
end
最后固化成一句自己的画图原则
序列图不是为了展示“我系统懂得很多”,而是为了把一次请求的真实运行路径讲清楚。
可以把原则压缩成这四句:
先定场景,再列角色。 先写文字,再连箭头。 先画主线,再补异常。 谁真参与,谁才上图。
一句话回收
序列图的本质,不是系统全景,而是一次请求在系统中的动态轨迹。