SpringBoot 3.2.7中RestClient无法传递TraceID问题咨询
问题解答:RestClient 微服务调用 TraceID 不传递问题
核心结论
Spring Boot 3.x 中使用 RestClient 进行微服务调用时,TraceID 不会自动传递,需要手动配置集成 Micrometer Tracing(原 Spring Cloud Sleuth 基于此实现)来完成链路追踪上下文的传递。
具体配置方案
1. 引入必要依赖
确保项目中添加了链路追踪相关依赖:
<!-- Maven 依赖示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <dependency> <groupId>io.zipkin.reporter2</groupId> <artifactId>zipkin-reporter-brave</artifactId> </dependency>
2. 修改 RestClient 配置,注入追踪拦截器
调整你的 RestClient Bean 配置,通过自定义拦截器传递 Trace 上下文:
import io.micrometer.tracing.Tracer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.RestClient; import java.io.IOException; @Configuration public class RestClientConfig { @Bean(name = "restClient1") public RestClient restClient(Tracer tracer) { return RestClient.builder() .baseUrl("http://localhost:9100/v3/rest") .defaultHeader("Content-Type", "application/json") .requestInterceptor(new TraceIdInterceptor(tracer)) .build(); } static class TraceIdInterceptor implements ClientHttpRequestInterceptor { private final Tracer tracer; public TraceIdInterceptor(Tracer tracer) { this.tracer = tracer; } @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { // 按W3C Trace Context规范传递traceparent头 tracer.currentSpan().context().forEach((key, value) -> { request.getHeaders().add(key, value); }); // 若系统使用自定义头(如X-Trace-ID),可手动添加: // request.getHeaders().add("X-Trace-ID", tracer.currentSpan().context().traceId()); return execution.execute(request, body); } } }
3. 接收端配置验证
微服务2需同步添加相同的 Micrometer Tracing 依赖,才能自动解析请求头中的 TraceID,保持链路上下文一致。
补充提示
- 若基于 Spring Cloud 生态开发,可结合
@LoadBalanced注解,RestClient 会自动注入追踪拦截器,无需手动编写自定义拦截器。 - 默认传递的头为
traceparent,遵循W3C标准,若业务有自定义头需求,可在拦截器中手动添加对应字段。
内容的提问来源于stack exchange,提问作者astar
相关产品推荐
相关产品推荐

