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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:52:46