链路追踪
分布式链路追踪通过在请求中注入 TraceId / SpanId,串联跨服务的调用链,用于定位性能瓶颈和故障根因。
- Spring Boot 3.x / Spring Cloud 2022+:使用 Micrometer Tracing(替代 Spring Cloud Sleuth)
- Spring Boot 2.x:使用 Spring Cloud Sleuth + Zipkin
核心概念
| 概念 | 说明 |
|---|---|
| Trace | 一次完整请求的全链路,由唯一 TraceId 标识 |
| Span | 链路中的一个操作单元(如一次 RPC、一次 DB 查询) |
| TraceId | 整个链路的唯一标识,跨服务传递 |
| SpanId | 当前 Span 的唯一标识 |
| ParentSpanId | 父 Span 的 ID,描述调用层级 |
| Baggage | 随 Trace 传递的自定义键值对 |
链路传播
Browser
│ TraceId=abc, SpanId=001
▼
Gateway
│ TraceId=abc, SpanId=002, ParentSpanId=001
▼
Order Service
│ TraceId=abc, SpanId=003, ParentSpanId=002
▼
MySQL / Redis / MQ
HTTP 请求通过 X-B3-TraceId、X-B3-SpanId 等 Header(B3 传播协议)跨服务传递上下文。
Spring Boot 3.x:Micrometer Tracing + Zipkin
依赖
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>配置
management:
tracing:
sampling:
probability: 1.0 # 采样率,生产建议 0.1
zipkin:
tracing:
endpoint: http://localhost:9411/api/v2/spans
logging:
pattern:
console: "%d{HH:mm:ss} [%X{traceId},%X{spanId}] %-5level %logger{36} - %msg%n"Spring Boot 2.x:Spring Cloud Sleuth + Zipkin
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>配置
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1.0启动 Zipkin Server
docker run -d -p 9411:9411 openzipkin/zipkin访问 http://localhost:9411 查看链路拓扑图。
自定义 Span
// Spring Boot 3.x(Micrometer)
@Autowired
private Tracer tracer;
public Order processOrder(Long id) {
Span span = tracer.nextSpan().name("process-order").start();
try (Tracer.SpanInScope ws = tracer.withSpan(span)) {
span.tag("order.id", String.valueOf(id));
span.event("order.validated");
return doProcess(id);
} catch (Exception e) {
span.error(e);
throw e;
} finally {
span.end();
}
}Baggage(跨服务传递自定义值)
// 写入(随请求自动传播)
BaggageField userId = BaggageField.create("user-id");
userId.updateValue("u_1001");
// 读取
String uid = BaggageField.getByName("user-id").getValue();与 Jaeger 集成(OpenTelemetry)
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-otel</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-otlp</artifactId>
</dependency>management:
otlp:
tracing:
endpoint: http://localhost:4318/v1/traces
tracing:
sampling:
probability: 1.0Zipkin vs Jaeger
| 特性 | Zipkin | Jaeger |
|---|---|---|
| 开发方 | Twitter / OpenZipkin | Uber / CNCF |
| UI | 简洁 | 功能丰富 |
| 协议支持 | B3、Thrift | B3、Jaeger、OTLP |
| 推荐场景 | 快速上手 | 大规模生产 |
相关链接
Spring Cloud
架构
- 可观测性
- OpenTelemetry
- SkyWalking
- 系统全貌
- 日志聚合
- 服务网格(Istio 透明追踪注入)