You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:37:08