微服务治理-链路追踪
链路追踪(Distributed Tracing)是微服务可观测性(Observability)的核心能力之一,用于在分布式系统中还原一次请求的完整调用路径,并定位性能瓶颈与故障点。
一、介绍
1.1 为什么需要链路追踪?
在单体应用中:一次请求在同一个进程内完成,只需要
- 打日志
- 打断点
- 其他调试
即可定位问题。
但在微服务架构中:
Client
↓
API Gateway
↓
User Service
↓
Order Service
↓
Payment Service
↓
Inventory Service
↓
DB / MQ
一次请求变成:
跨进程 + 跨机器 + 跨网络
1.2 典型问题
问题1:不知道慢在哪里
比如 :接口很慢
但系统里有:Gateway、User、、Order…
你无法判断:到底慢在谁?
问题2:日志分散
如: Gateway logs User logs Order logs Payment logs
每个服务都有日志,但它们之间没有关联关系。
问题3:无法串联一次请求
无法确认日志是不是同一个请求?
1.3 链路追踪要解决什么问题?
把一次请求在多个微服务中的完整路径“串起来”
核心能力:
- 请求路径可视化
- 性能瓶颈定位
- 服务依赖分析
- 故障快速定位
二、原理
2.1 核心概念
链路追踪有三个核心概念:
1.Trace(一次完整请求)
Trace = 一次完整请求生命周期
例如:
用户点击下单按钮 = 1个 Trace
2. Span(一次调用)
Span 表示:
一次服务调用 / 一个方法执行
例如:
Gateway → UserService = 1 Span
UserService → OrderService = 1 Span
3. TraceID(全局唯一ID)
用于串联所有服务:
TraceID: 8f3a21
所有日志都带这个 ID。
2.2 调用链结构
Trace (请求A)
│
├── Span1: Gateway
│ ├── Span1.1: Auth
│
├── Span2: User Service
│ ├── DB Query
│
├── Span3: Order Service
│
└── Span4: Payment Service
2.3 TraceID 传递机制
关键点:
TraceID 必须跨服务传递
HTTP Header 传递
X-Trace-Id: 8f3a21
调用流程
Client
↓ (生成 TraceID)
Gateway
↓ (透传 TraceID)
User Service
↓ (继续透传)
Order Service
↓
Payment Service
2.4 Span 结构
每个 Span 包含:
{
"traceId": "8f3a21",
"spanId": "a1",
"parentSpanId": "a0",
"service": "user-service",
"operation": "getUser",
"startTime": 100,
"endTime": 115,
"duration": 15
}
2.5 数据上报模型
链路追踪通常是:
异步上报
流程:
Service
↓
Collector
↓
Storage
↓
UI(Jaeger / Zipkin)
2.6 典型系统架构
Client
↓
API Gateway
↓
Microservices
↓
OpenTelemetry SDK
↓
Collector
↓
Jaeger / Zipkin / Tempo
三、实现
OpenTelemetry(OTel)
核心能力
- 自动生成 Trace / Span
- 自动采集 HTTP / DB / RPC
- 自动上报
四、最佳实践
4.1 必须全链路 TraceID 透传
所有:
- HTTP
- RPC
- MQ
都必须带:
TraceID
4.2 不要只靠日志排查问题
4.3 采样(Sampling)
生产环境不能全量记录
4.4 Trace + Metrics + Logs 三位一体
Logs(发生了什么)
Metrics(系统健康)
Traces(请求路径)
4.5 慢请求定位策略
Trace分析:
找最长 Span