随着服务拆分,单次请求可能跨越十几个服务。没有分布式追踪,很难定位性能瓶颈或故障。
1. 分布式追踪的目标
- 记录请求在系统中的全链路轨迹。
- 量化每个服务的耗时。
- 快速定位异常节点。
2. 核心概念
- TraceId:一次完整请求的唯一标识。
- SpanId:单个服务或调用片段的标识。
- ParentId:上游调用方的SpanId。
- 采样率:控制追踪开销,只记录部分请求。
3. 数据模型
每个请求形成一棵调用树:
TraceId=123
├── Service A (50ms)
│ ├── Service B (20ms)
│ └── Service C (30ms)
└── Service D (100ms)
4. 常见实现框架
- Zipkin:Spring Cloud Sleuth默认整合方案。
- Jaeger:CNCF 项目,支持多语言。
- SkyWalking:功能全面,适合大规模集群。
- OpenTelemetry:统一标准,兼容多种后端。
5. 实现流程
- 网关生成 TraceId 并注入请求 Header。
- 下游服务读取并传递 TraceId。
- 每个服务记录 Span 数据上报。
- 收集端聚合成调用链并展示。
6. 实践建议
- 在入口处统一生成 TraceId,防止断链。
- 控制采样率,避免性能开销。
- 日志打印中附带 TraceId,便于排查。
结论:分布式追踪让系统透明可观。理解调用链是优化性能和稳定性的第一步。