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

Spring Boot应用中如何从HTTP请求头读取Request ID并传递给所有HTTP客户端

在Spring Boot中为出站HTTP请求传递Request ID

问题分析

你已经通过Filter将入站请求的X-Request-ID存入MDC,但直接在RestTemplateBuilder的defaultHeader中无法动态获取当前请求的MDC值——因为defaultHeader是在Bean初始化时静态设置的,而非每个请求触发时动态读取。

解决方案:使用客户端拦截器动态获取MDC值

通过ClientHttpRequestInterceptor,可以在每个出站请求发送前,从MDC中读取当前请求的X-Request-ID并添加到请求头中:

@Component
class RestTemplateConfig {

    @Bean
    fun restTemplate(): RestTemplate =
        RestTemplateBuilder()
            .additionalInterceptors(RequestIdInterceptor())
            .build()
}

class RequestIdInterceptor : ClientHttpRequestInterceptor {
    override fun intercept(
        request: HttpRequest,
        body: ByteArray,
        execution: ClientHttpRequestExecution
    ): ClientHttpResponse {
        // 从MDC获取当前请求的Request ID,无值时生成默认UUID
        val requestId = MDC.get("X-Request-ID") ?: UUID.randomUUID().toString()
        request.headers.set("X-Request-ID", requestId)
        return execution.execute(request, body)
    }
}

优化入站Filter(可选)

原Filter中如果请求头没有X-Request-ID就直接return,会导致后续请求链中断。建议改为无ID时自动生成一个,确保所有请求都有追踪标识:

@Component
class MdcFilter : Filter {
    private val log = KotlinLogging.logger {}

    override fun doFilter(request: ServletRequest?, response: ServletResponse?, chain: FilterChain?) {
        val httpRequest = request as HttpServletRequest
        // 优先从请求头取ID,无值则生成UUID
        val xRequestId = httpRequest.getHeader("X-Request-ID") ?: UUID.randomUUID().toString()
        MDC.put("X-Request-ID", xRequestId)
        log.debug { "X-Request-ID: $xRequestId is set as MDC variable" }
        try {
            chain?.doFilter(request, response)
        } finally {
            // 确保MDC值被移除,避免线程复用导致的标识污染
            MDC.remove("X-Request-ID")
        }
    }
}

关键说明

  • ClientHttpRequestInterceptor会在每个出站请求执行前触发,能动态读取当前线程MDC中的值,适配多线程环境。
  • 使用finally块移除MDC值,防止线程池复用线程时携带旧的Request ID。
  • 生成默认ID的逻辑保证了即使入站请求没有携带ID,整个调用链路依然有可追踪的唯一标识。

内容的提问来源于stack exchange,提问作者nusmanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:15:06