使用Micrometer Tracing Brave+RestTemplate/WebClient时TraceId无法跨服务传递
问题原因
直接创建的WebClient/RestTemplate实例没有集成Micrometer Tracing的拦截器/过滤器,导致无法自动传递traceparent请求头,服务2无法识别上游的TraceId,只能生成新的追踪ID。
解决方案
1. 修复WebClient配置
别直接用WebClient.create()初始化,改用WebClient.Builder并注入追踪过滤器:
@Bean public WebClient webClient(TracingExchangeFilterFunction tracingFilter) { return WebClient.builder() .baseUrl("http://localhost:8080") .filter(tracingFilter) .build(); }
TracingExchangeFilterFunction是Micrometer Tracing自动配置的Bean,直接注入后就能自动给请求添加traceparent等追踪头。
2. 修复RestTemplate配置
针对RestTemplate有两种修复方式:
方式一:用自动配置的RestTemplateBuilder构建
@Bean public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { return restTemplateBuilder.build(); }
Spring Boot的RestTemplateBuilder已经内置了TracingClientHttpRequestInterceptor,通过它构建的RestTemplate会自动传递追踪头。
方式二:手动添加追踪拦截器
@Bean public RestTemplate restTemplate(TracingClientHttpRequestInterceptor tracingInterceptor) { RestTemplate restTemplate = new RestTemplate(); restTemplate.getInterceptors().add(tracingInterceptor); return restTemplate; }
3. 确认依赖完整性
两个服务的pom.xml里,除了现有依赖,还要根据客户端类型补全基础依赖:
- 用WebClient的话,添加WebFlux依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>
- 用RestTemplate的话,添加Web依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Micrometer相关依赖已经通过micrometer-tracing-bridge-brave间接引入,无需额外添加。
4. 验证追踪头传递
可以在服务2的Controller里打印请求头,确认traceparent是否正确传递:
@GetMapping public String hello(HttpServletRequest request) { System.out.println("Received traceparent: " + request.getHeader("traceparent")); return "Hello from service 2"; }
如果能输出服务1的TraceId,说明传递成功。
内容的提问来源于stack exchange,提问作者Poklakni
相关产品推荐
相关产品推荐

