09.13微服务间追踪传播

分类: 后端集成 Java Spring Boot OpenTelemetry

微服务间追踪传播

欢迎回到第 9 章的学习。在上一节,我们学习了生产环境配置。现在我们要学习微服务间追踪传播,这对于分布式系统的可观察性非常重要。

本节将学习:HTTP 调用追踪、Feign Client 集成、RestTemplate 集成、以及 Trace Context 传播。

HTTP 调用追踪

HTTP 调用追踪的作用是什么? 当一个微服务调用另一个微服务时,需要在 HTTP 请求头中传播追踪上下文,这样才能保持完整的追踪链路。

追踪上下文传播机制是什么? OpenTelemetry 使用 W3C Trace Context 标准,通过 HTTP Header 传播追踪上下文,包括

traceparent
Header。

traceparent Header 格式:

traceparent: 00-{traceId}-{parentSpanId}-{traceFlags}
。这个 Header 包含了完整的追踪上下文信息。

自动传播: OpenTelemetry 的 Spring 集成会自动在 HTTP 请求头中添加追踪上下文,无需手动处理。

代码示例:

文件路径:

src/main/java/com/shoehub/orderservice/service/PaymentService.java

package com.shoehub.orderservice.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class PaymentService {
    
    @Autowired
    private RestTemplate restTemplate;
    
    private static final String PAYMENT_SERVICE_URL = "http://localhost:8081/api/payments";
    
    public PaymentResponse processPayment(PaymentRequest request) {
        // OpenTelemetry It will be automatically added to the request header traceparent Header
        ResponseEntity<PaymentResponse> response = restTemplate.postForEntity(
            PAYMENT_SERVICE_URL,
            request,
            PaymentResponse.class
        );
        return response.getBody();
    }
}

Feign Client 集成

Feign Client 是什么? Feign Client 是 Spring Cloud 中常用的 HTTP 客户端,提供声明式的服务调用,简化 HTTP 调用代码。

如何集成 OpenTelemetry? 添加 Spring Cloud OpenFeign 依赖,创建 Feign Client 接口,OpenTelemetry 的 Spring Cloud 集成会自动处理追踪上下文传播。

配置步骤:

第一步:添加依赖。

pom.xml
build.gradle
中添加
spring-cloud-starter-openfeign
依赖。

第二步:启用 Feign Clients。 在主类上添加

@EnableFeignClients
注解。

第三步:创建 Feign Client 接口。 使用

@FeignClient(name = "payment-service", url = "http://localhost:8081")
创建接口,定义方法。

第四步:使用 Feign Client。 在 Service 中注入 Feign Client,调用方法,OpenTelemetry 会自动传播追踪上下文。

代码示例:

文件路径:

pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

文件路径:

src/main/java/com/shoehub/orderservice/OrderServiceApplication.java

@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

文件路径:

src/main/java/com/shoehub/orderservice/client/PaymentServiceClient.java

package com.shoehub.orderservice.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(name = "payment-service", url = "http://localhost:8081")
public interface PaymentServiceClient {
    
    @PostMapping("/api/payments")
    PaymentResponse processPayment(@RequestBody PaymentRequest request);
}

RestTemplate 集成

RestTemplate 是什么? RestTemplate 是 Spring 框架中的 HTTP 客户端,提供同步的 HTTP 调用,广泛使用。

如何集成 OpenTelemetry? 配置 RestTemplate Bean,使用 RestTemplate 发送 HTTP 请求,OpenTelemetry 的 Spring 集成会自动在请求头中添加追踪上下文。

配置步骤:

第一步:配置 RestTemplate Bean。 创建配置类,使用

@Bean
注解创建 RestTemplate 实例。

第二步:使用 RestTemplate。 在 Service 中注入 RestTemplate,使用

restTemplate.getForObject()
restTemplate.postForObject()
发送请求。

第三步:自动传播。 OpenTelemetry 会自动在请求头中添加

traceparent
Header,无需手动处理。

代码示例:

文件路径:

src/main/java/com/shoehub/orderservice/config/RestTemplateConfig.java

package com.shoehub.orderservice.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {
    
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

文件路径:

src/main/java/com/shoehub/orderservice/service/PaymentService.java

@Service
public class PaymentService {
    
    @Autowired
    private RestTemplate restTemplate;
    
    public PaymentResponse processPayment(PaymentRequest request) {
        // OpenTelemetry It will be automatically added to the request header traceparent Header
        return restTemplate.postForObject(
            "http://localhost:8081/api/payments",
            request,
            PaymentResponse.class
        );
    }
}

Trace Context 传播

Trace Context 传播的标准是什么? W3C Trace Context 标准,定义了追踪上下文在 HTTP 请求中的传播格式。

traceparent Header 格式:

traceparent: 00-{traceId}-{parentSpanId}-{traceFlags}

  • 版本(00): 版本号,当前是 00。
  • Trace ID: 32 字节的十六进制字符串,唯一标识追踪。
  • Parent Span ID: 16 字节的十六进制字符串,父 Span 的 ID。
  • Trace Flags: 1 字节的十六进制,包含采样标志等。

传播流程: 服务 A 调用服务 B → OpenTelemetry 在请求头中添加 traceparent → 服务 B 接收请求,提取追踪上下文 → 服务 B 创建新的 Span,作为服务 A 的子 Span → 服务 B 调用服务 C,继续传播。

HTTP Header 示例:

# utilized curl viewed HTTP Header
curl -v http://localhost:8080/api/orders \
  -H "Content-Type: application/json" \
  -d '{"userId": "user-123", "productId": "product-456"}'

# The response will include traceparent Header(In the request header)
# traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01

traceparent Header 格式说明:

  • 00
    - 版本号
  • 4bf92f3577b34da6a3ce929d0e0e4736
    - Trace ID(32 字符)
  • 00f067aa0ba902b7
    - Parent Span ID(16 字符)
  • 01
    - Trace Flags(采样标志)

本节小结

在本节中,我们学习了微服务间追踪传播:

第一个是 HTTP 调用追踪。 通过 HTTP Header 传播追踪上下文,使用 W3C Trace Context 标准,自动传播。

第二个是 Feign Client 集成。 添加 Feign 依赖,创建接口,OpenTelemetry 自动处理。

第三个是 RestTemplate 集成。 配置 Bean,使用 RestTemplate,OpenTelemetry 自动处理。

第四个是 Trace Context 传播。 W3C Trace Context 标准,traceparent Header 格式,自动传播机制,完整链路追踪。

微服务间追踪传播流程: 服务 A 调用服务 B → 在 HTTP Header 中传播 Trace Context → 服务 B 接收并创建子 Span → 服务 B 调用服务 C,继续传播 → 完整的跨服务追踪链路。

这就是微服务间追踪传播。通过追踪上下文传播,我们可以在分布式系统中保持完整的追踪链路。

在下一节,我们将学习性能优化。学习如何优化可观察性系统的性能。