Spring Boot 3.1.0升级后Micrometer跨服务TraceId不一致问题求助
你遇到的核心问题是RestTemplate没有自动传递分布式追踪上下文,导致服务B无法承接服务A的TraceId,从而生成新的追踪链路。以下是具体的排查和解决步骤:
1. 确保RestTemplate被Micrometer Observation增强
Spring Cloud Sleuth会自动包装RestTemplate来传递追踪信息,但Micrometer Tracing需要你显式让RestTemplate具备观测能力。有两种实现方式:
方式一:使用自动配置的RestTemplateBuilder创建实例
Spring Boot自动配置的RestTemplateBuilder已经包含了ObservationClientHttpRequestInterceptor,直接注入builder来创建RestTemplate即可:
@Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); }
方式二:手动添加观测拦截器到自定义RestTemplate
如果是自己手动new的RestTemplate,需要手动添加拦截器:
import io.micrometer.observation.ObservationRegistry; import org.springframework.web.client.RestTemplate; import org.springframework.http.client.ObservationClientHttpRequestInterceptor; @Bean public RestTemplate restTemplate(ObservationRegistry observationRegistry) { RestTemplate restTemplate = new RestTemplate(); restTemplate.getInterceptors().add(new ObservationClientHttpRequestInterceptor(observationRegistry)); return restTemplate; }
2. 配置B3格式的追踪头传播
你之前使用Spring Cloud Sleuth(基于Brave),默认用的是B3格式的请求头(X-B3-TraceId、X-B3-SpanId等)。但Micrometer Tracing默认使用W3C的traceparent请求头,若不配置兼容B3,服务B无法识别服务A传递的追踪信息,会生成新的TraceId。
在application.yml或application.properties中添加配置:
management: tracing: propagation: type: b3 # 若要同时支持W3C和B3,可设置为b3,w3c
3. 验证依赖兼容性
确认你的依赖版本与Spring Boot 3.1.0匹配:
micrometer-tracing-bridge-brave:1.1.1:与Spring Boot 3.1.x兼容context-propagation:1.0.3:版本正确micrometer-observation:无需指定版本,Spring Boot 3.1.0已自带对应版本,可移除版本号避免冲突
关于请求头的疑问
不需要手动添加X-B3-TraceId等请求头。只要RestTemplate被正确增强,且传播格式配置为B3,Micrometer会自动在跨服务请求中注入对应的B3系列请求头,服务B也会自动解析这些头来延续TraceId。
内容的提问来源于stack exchange,提问作者Aditi

