如何在Spring Boot Feign中配置请求拦截器注入关联令牌头
解决方案
在Spring Cloud OpenFeign的自动配置场景下,不需要手动使用Feign.builder,通过以下两种方式就能让你的CorrelationTokenInterceptor生效,同时把硬编码的令牌值替换成MDC上下文的内容:
1. 先完善拦截器逻辑
首先修改拦截器,从MDC中获取关联令牌(假设MDC中存储的键是X-CorrelationToken,如果实际键不同请替换):
import feign.RequestInterceptor; import feign.RequestTemplate; import org.slf4j.MDC; public class CorrelationTokenInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { // 从MDC获取关联令牌,不存在时可设为空或默认值 String correlationToken = MDC.get("X-CorrelationToken"); if (correlationToken != null) { template.header("X-CorrelationToken", correlationToken); } } }
2. 方式一:全局生效(所有Feign客户端自动使用)
直接把拦截器注册为Spring的Bean即可,Spring Cloud OpenFeign会自动把所有RequestInterceptor类型的Bean应用到所有Feign客户端:
方法A:用@Component注解
给拦截器类加上@Component注解:
import feign.RequestInterceptor; import feign.RequestTemplate; import org.slf4j.MDC; import org.springframework.stereotype.Component; @Component public class CorrelationTokenInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { String correlationToken = MDC.get("X-CorrelationToken"); if (correlationToken != null) { template.header("X-CorrelationToken", correlationToken); } } }
方法B:用配置类注册Bean
如果不想给拦截器加@Component,也可以用配置类注册:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignInterceptorConfig { @Bean public CorrelationTokenInterceptor correlationTokenInterceptor() { return new CorrelationTokenInterceptor(); } }
3. 方式二:指定单个/部分Feign客户端生效
如果只想让特定的Feign客户端使用这个拦截器,可以通过以下两种方式:
方法A:通过@FeignClient的configuration属性指定
先创建配置类注册拦截器Bean,再在Feign客户端接口中引用:
// 自定义Feign配置类 @Configuration public class SomeApiFeignConfig { @Bean public CorrelationTokenInterceptor correlationTokenInterceptor() { return new CorrelationTokenInterceptor(); } } // 修改Feign客户端接口,关联配置类 @FeignClient(value="some-api", url="${client.some-api}", configuration = SomeApiFeignConfig.class) public interface SomeApi { @GetMapping(value = "/someurl", consumes = "application/json") String getSomething(@PathVariable("eventId") String eventId); // 其他接口... }
方法B:通过配置文件指定
在YAML配置中,针对特定客户端或全局客户端添加拦截器:
feign: client: config: # 替换成具体客户端名称(比如some-api)则只给该客户端生效,用default表示全局生效 default: connectTimeout: ${FEIGN_CONNECT_TIMEOUT:180000} readTimeout: ${FEIGN_READ_TIMEOUT:180000} loggerLevel: full # 指定拦截器的全类名 requestInterceptors: - com.yourpackage.CorrelationTokenInterceptor
注意事项
- 你的Spring Cloud OpenFeign版本(2.0.0.RELEASE)完全兼容上述配置方式。
- 要保证MDC中确实存在对应的关联令牌值,通常需要在请求入口(如Controller层)提前将令牌放入MDC。
内容的提问来源于stack exchange,提问作者John Little
相关产品推荐
相关产品推荐

