Spring Boot 2与3跨应用追踪:兼容B3和W3C格式方案问询
实现Spring Boot 3同时支持B3和W3C链路追踪头格式
完全可行,Brave(Micrometer Tracing默认实现)支持通过组合传播工厂的方式,同时识别并处理B3和W3C traceparent两种格式的链路追踪头,完美适配内部Spring Boot 2服务与外部W3C兼容应用的需求。
核心配置方案
通过PropagationFactory.composite()将B3和W3C的传播工厂组合,实现:
- 提取(解析请求头):优先尝试B3格式,若不存在则解析W3C
traceparent,确保两种格式的请求都能被正确追踪 - 注入(生成请求/响应头):默认使用B3格式(保持与内部Spring Boot 2服务的兼容),也可配置同时注入两种格式适配外部应用
基础配置(识别两种格式,内部传播用B3)
替换你现有的Tracing Bean,改用组合传播工厂:
import brave.Tracing; import brave.propagation.B3Propagation; import brave.propagation.PropagationFactory; import brave.propagation.W3CTraceContextPropagation; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TracingConfiguration { @Bean public Tracing braveTracing() { // 配置B3单头格式的传播工厂(与Spring Boot 2 Sleuth保持一致) PropagationFactory b3PropagationFactory = B3Propagation.newFactoryBuilder() .injectFormat(B3Propagation.Format.SINGLE) .build(); // W3C traceparent标准传播工厂 PropagationFactory w3cPropagationFactory = W3CTraceContextPropagation.FACTORY; // 组合两种传播工厂:提取时依次尝试B3 → W3C,注入时使用第一个有效的(B3) PropagationFactory compositeFactory = PropagationFactory.composite(b3PropagationFactory, w3cPropagationFactory); return Tracing.newBuilder() .propagationFactory(compositeFactory) .build(); } }
进阶配置(同时注入B3和W3C两种格式)
如果需要服务发出请求时同时携带两种格式的头(既兼容内部Spring Boot 2,又支持外部W3C应用),可以通过Propagation.multi()配置多格式注入:
import brave.Tracing; import brave.propagation.B3Propagation; import brave.propagation.Propagation; import brave.propagation.PropagationFactory; import brave.propagation.W3CTraceContextPropagation; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TracingConfiguration { @Bean public Tracing braveTracing() { // 定义B3和W3C的传播实现 Propagation<String> b3Propagation = B3Propagation.newFactoryBuilder() .injectFormat(B3Propagation.Format.SINGLE) .build() .create(Propagation.KeyFactory.STRING); Propagation<String> w3cPropagation = W3CTraceContextPropagation.FACTORY.create(Propagation.KeyFactory.STRING); // 配置同时注入两种格式的传播 Propagation<String> multiPropagation = Propagation.multi(b3Propagation, w3cPropagation); // 组合传播工厂,强制使用多格式注入 PropagationFactory compositeFactory = PropagationFactory.composite( B3Propagation.newFactoryBuilder().injectFormat(B3Propagation.Format.SINGLE).build(), W3CTraceContextPropagation.FACTORY ) { @Override public <K> Propagation<K> create(Propagation.KeyFactory<K> keyFactory) { // 强制返回多格式传播实例 return (Propagation<K>) multiPropagation; } }; return Tracing.newBuilder() .propagationFactory(compositeFactory) .build(); } }
依赖说明
确保项目中已引入正确的Micrometer Tracing Brave桥接依赖:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <dependency> <groupId>io.zipkin.reporter2</groupId> <artifactId>zipkin-reporter-brave</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者Michiel
相关产品推荐
相关产品推荐

