Spring Boot 3中使用WebClient传递B3追踪头的方案咨询
Spring Boot 3 下 WebClient 传递 B3 Trace Header 方案
核心实现:基于 Brave 适配 WebClient
由于 Spring Sleuth 不再兼容 Spring Boot 3,直接基于 Brave 组件实现 B3 Header 传递是最可靠的方案,可替代原 TracingClientHttpRequestInterceptor 适配 WebClient 场景:
1. 依赖配置
引入 Brave 核心及 WebFlux 适配依赖:
<!-- Brave 核心依赖 --> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave</artifactId> <version>5.14.1</version> <!-- 选择适配 Spring Boot 3 的稳定版本 --> </dependency> <!-- WebFlux 链路追踪适配 --> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-spring-webflux</artifactId> <version>5.14.1</version> </dependency>
2. 自定义 ExchangeFilterFunction
实现类似 TraceExchangeFilterFunction 的逻辑,从当前链路上下文提取 B3 信息并注入请求头:
import brave.Tracer; import org.springframework.web.reactive.function.client.ExchangeFilterFunction; import org.springframework.web.reactive.function.client.ClientRequest; import org.springframework.web.reactive.function.client.ClientResponse; import reactor.core.publisher.Mono; public class B3TraceExchangeFilterFunction implements ExchangeFilterFunction { private final Tracer tracer; public B3TraceExchangeFilterFunction(Tracer tracer) { this.tracer = tracer; } @Override public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) { ClientRequest.Builder modifiedRequest = ClientRequest.from(request); // 从当前 Span 提取 B3 字段并设置到请求头 tracer.currentSpanCustomizer().ifPresent(span -> { modifiedRequest.header("X-B3-TraceId", span.context().traceIdString()); modifiedRequest.header("X-B3-SpanId", span.context().spanIdString()); if (span.context().parentId() != null) { modifiedRequest.header("X-B3-ParentSpanId", span.context().parentIdString()); } modifiedRequest.header("X-B3-Sampled", span.context().sampled() != null ? span.context().sampled().toString() : "1"); }); return next.exchange(modifiedRequest.build()); } }
3. 配置 WebClient Bean
将自定义过滤器注入 WebClient 实例:
import io.zipkin.brave.Tracer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; @Configuration public class WebClientConfig { @Bean public WebClient webClient(Tracer tracer) { return WebClient.builder() .filter(new B3TraceExchangeFilterFunction(tracer)) .build(); } }
关于 reactor-netty-http-brave 的说明
你提到的 io.projectreactor.netty:reactor-netty-http-brave 确实已被官方废弃,目前推荐直接使用 Brave 提供的 brave-spring-webflux 组件实现 WebClient 链路追踪,上述方案正是基于该官方推荐路径构建。
内容的提问来源于stack exchange,提问作者Bademus
相关产品推荐
相关产品推荐

