SpringCloud中FeignClient自定義配置
前言
最近公司新老項目對接過程中使用feginClient進行調用時遇到了很多問題,在此做些簡短的總結記錄
一、Feign的配置原理
當我們配置一個feignClient的時候,通常的寫法是這樣的
@FeignClient("xxxClient") public interface xxxClient{ }
當我們做這個實際上就是生成一個默認的FeignClient, 其配置在org.springframework.cloud.openfeign
包下的FeignClientsConfiguration
@Configuration public class FeignClientsConfiguration { @Autowired private ObjectFactory<HttpMessageConverters> messageConverters; @Autowired(required = false) private List<AnnotatedParameterProcessor> parameterProcessors = new ArrayList<>(); @Autowired(required = false) private List<FeignFormatterRegistrar> feignFormatterRegistrars = new ArrayList<>(); @Autowired(required = false) private Logger logger; @Bean @ConditionalOnMissingBean public Decoder feignDecoder() { return new OptionalDecoder(new ResponseEntityDecoder(new SpringDecoder(this.messageConverters))); } @Bean @ConditionalOnMissingBean public Encoder feignEncoder() { return new SpringEncoder(this.messageConverters); } @Bean @ConditionalOnMissingBean public Contract feignContract(ConversionService feignConversionService) { return new SpringMvcContract(this.parameterProcessors, feignConversionService); } @Bean public FormattingConversionService feignConversionService() { FormattingConversionService conversionService = new DefaultFormattingConversionService(); for (FeignFormatterRegistrar feignFormatterRegistrar : feignFormatterRegistrars) { feignFormatterRegistrar.registerFormatters(conversionService); } return conversionService; } @Configuration @ConditionalOnClass({ HystrixCommand.class, HystrixFeign.class }) protected static class HystrixFeignConfiguration { @Bean @Scope("prototype") @ConditionalOnMissingBean @ConditionalOnProperty(name = "feign.hystrix.enabled") public Feign.Builder feignHystrixBuilder() { return HystrixFeign.builder(); } } @Bean @ConditionalOnMissingBean public Retryer feignRetryer() { return Retryer.NEVER_RETRY; } @Bean @Scope("prototype") @ConditionalOnMissingBean public Feign.Builder feignBuilder(Retryer retryer) { return Feign.builder().retryer(retryer); } @Bean @ConditionalOnMissingBean(FeignLoggerFactory.class) public FeignLoggerFactory feignLoggerFactory() { return new DefaultFeignLoggerFactory(logger); } }
可以看到這上面所有注入的bean都有一個注解@ConditionalOnMissingBean
,也就沒有自定義則觸發(fā)創(chuàng)建Bean
這一段Bean的注入在FeignClientFactoryBean
中的這段代碼, 當服務啟動時觸發(fā)
protected Feign.Builder feign(FeignContext context) { FeignLoggerFactory loggerFactory = get(context, FeignLoggerFactory.class); Logger logger = loggerFactory.create(type); // @formatter:off 從spring上下文中獲取對應的Bean Feign.Builder builder = get(context, Feign.Builder.class) // required values .logger(logger) .encoder(get(context, Encoder.class)) .decoder(get(context, Decoder.class)) .contract(get(context, Contract.class)); // @formatter:on configureFeign(context, builder); return builder; }
二、自定義配置
這就意味著如果我們需要自定義FeignClient
的相關配置可以直接注入其中一個bean就可以了
類似于
@Configuration public class FeignClientsConfiguration { @Bean public Decoder feignDecoder() { return new ResultDecoder(); } @Bean public Encoder feignEncoder() { return new ParamEncoder(); } @Bean public Contract feignContract() { return new DefaultContract(); } }
如上所示, 我分別注入了Decoder、Encoder、Contract, 而其他幾項依然還是feign默認值.
三、專有配置
那么如果我想為一個client單獨加一些配置又應該如何做呢?
點開@FeignClient可以看到里面有一項configuration
/** * A custom <code>@Configuration</code> for the feign client. Can contain override * <code>@Bean</code> definition for the pieces that make up the client, for instance * {@link feign.codec.Decoder}, {@link feign.codec.Encoder}, {@link feign.Contract}. * * @see FeignClientsConfiguration for the defaults */ Class<?>[] configuration() default {};
所以我們可以寫一個如下的configuration
public class SelfFeignClientsConfiguration { @Bean @ConditionalOnMissingBean(name = "SelfFeignDecoder") public Decoder SelfFeignDecoder() { return new JacksonDecoder(); } }
再在feignClient上引入
@FeignClient(name = "xxxClient", configuration = SelfFeignClientsConfiguration.class) public interface xxxClient{ }
如此即可完成對xxxClient更細粒度的配置.
到此這篇關于SpringCloud中FeignClient自定義配置的文章就介紹到這了,更多相關SpringCloud FeignClient配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringCloud中的@FeignClient注解使用詳解
- springcloud之FeignClient使用詳解
- SpringCloud @FeignClient注入Spring容器原理分析
- SpringCloud之@FeignClient()注解的使用詳解
- SpringCloud FeignClient 超時設置
- SpringCloud全面解析@FeignClient標識接口的過程
- SpringCloud引入feign失敗或找不到@EnableFeignClients注解問題
- SpringCloud @FeignClient參數(shù)的用法解析
- SpringCloud之@FeignClient()注解的使用方式
相關文章
Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權模式
這篇文章主要介紹了Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權模式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09java -jar設置添加啟動參數(shù)實現(xiàn)方法
這篇文章主要介紹了java -jar設置添加啟動參數(shù)實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02關于jdk9、jdk10、jdk11、jdk12、jdk13新特性說明
這篇文章主要介紹了關于jdk9、jdk10、jdk11、jdk12、jdk13新特性說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05Springboot單體架構http請求轉換https請求來支持微信小程序調用接口
這篇文章主要介紹了Springboot單體架構http請求轉換https請求來支持微信小程序調用接口,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11