链路追踪

返回 Spring Cloud

分布式链路追踪通过在请求中注入 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-TraceIdX-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.0

Zipkin vs Jaeger

特性ZipkinJaeger
开发方Twitter / OpenZipkinUber / CNCF
UI简洁功能丰富
协议支持B3、ThriftB3、Jaeger、OTLP
推荐场景快速上手大规模生产

相关链接

Spring Cloud

架构