背景
今天项目开发过程中,需要在给别人提供的feign的spi中添加一些功能,让调用方通过我提供的Feign调用的时候能额外加一个请求头,配置代码如下:
@Configuration
@ConditionalOnProperty(value = "api.audit.log.enabled", matchIfMissing = true)
public class DemoFeignClientConfig {
@Value("${spring.application.name:UNKNOWN}")
private String appName;
@Bean
public RequestInterceptor headerInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header(HEADER_APP_NAME, appName);
}
};
}
}
同时在提供的jar包的resources/META-INF/spring.factories
下配置,这个不懂的可以搜索spring.factories机制
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.platform.config.DemoFeignClientConfig
此时当调用方依赖了这个spi包后,上面的配置就会生效,发出请求的时候会过这个RequestInterceptor
,在请求头上加入应用名,但此时有个问题,那就是这个RequestInterceptor
是全局的,也就是说不止是调我这个spi时会被加上这个请求头,通过feign调用其他服务时也会被加上这个请求头,RequestInterceptor
当被全局加载后破坏性还不是很大,因为在Feign的源码中可以看到RequestInterceptor
时会加载多个的(下面代码),所以顶多就是多了个header,但是如果上面配置了自己的encoder
和decoder
,那可就要出大问题了,如果调用方没有配置自己特殊的encoder
和decoder
,那就会把Feign默认的FeignClientsConfiguration
配置的给覆盖掉,如果调用方配置了自己的encoder
和decoder
,那就直接启动不了了,无论哪种情