OpenFegin是一个客户端,是不是可以进行一些客户端的超时时间等内容的配置呢?答案当然是可以的,OpenFegin为我们提供了一些默认配置,这些默认配置定义在FeignClientsConfiguration中。当然我们可以不用默认的,指定自己的自定义配置。
配置项
- Decoder:用于配置如何解析请求响应的解析器
- Encoder:用于将请求内容封装:如对象->JSON
- Logger:配置日志实现
- Contract:契约,就是定义可以识别哪些注解,默认
SpringMvcContract就可以识别SpringMVC的注解 - Client:执行发送请求的客户端,OkHttp、HttpClient、Ribbon客户端(底层还是OkHttp或HttpClient)、…
- Feign.Builder:Fegin的一个构造器有以下2种
- HystrixFeign.Builder:HystrixFegin构造器,当开启
feign.hystrix.enabled=true时有效 - FeignCircuitBreaker.Builder:FeignCircuitBreaker,当开启
feign.circuitbreaker.enabled=true时有效以上配置是默认配置的内容
- HystrixFeign.Builder:HystrixFegin构造器,当开启
- Logger.Level:fegin调用日志打印级别,需要设置FeginClient接口类日志级别为
DEBUG后生效 - Retryer:重试次数
- ErrorDecoder:
- Request.Options:
- Collection
:请求拦截器,可以在请求前设置一些请求头信息 - SetterFactory:
- QueryMapEncoder:
配置方式
Fegin支持2种形式的自定义配置:YAML和配置类,下面我以配置日志打印级别为例来展示两种配置方式。YAML方式
feign:client:config:default:loggerLevel: BASICclient1:loggerLevel: FULLclient2:loggerLevel: NONElogging:level:com.gao.consumernacosdemo.client: debug
解释:
- default:指定默认的日志级别为BASIC
- client1:指定contextId为cleint1的FeignClient接口的日志级别为FULL
- cleint2:指定contextId为cleint2的FeignClient接口的日志级别为NONE
- 若开启Fegin日志必须将Feign接口的日志级别设置为debug
@RestControllerpublic class ConsumerNacosDemoController {@Autowiredprivate ProviderClient providerClient;@Autowiredprivate ProviderClient2 providerClient2;@Autowiredprivate ProviderClient3 providerClient3;@RequestMapping("testFegin")public String testFegin() {return providerClient.test();}@RequestMapping("testFegin2")public String testFegin2() {return providerClient2.test();}@RequestMapping("testFegin3")public String testFegin3() {return providerClient3.test();}}
@FeignClient(name = "provider-nacos",contextId = "client1")public interface ProviderClient {@RequestMapping("test")String test();}@FeignClient(name = "provider-nacos",contextId = "client2")public interface ProviderClient2 {@RequestMapping("test")String test();}@FeignClient(name = "provider-nacos",contextId = "client3")public interface ProviderClient3 {@RequestMapping("test")String test();}
配置类方式
logging:level:com.gao.consumernacosdemo.client: debug
//@Configurationpublic class ProviderClientConfig {@Beanpublic Logger.Level loggerLevel(){return Logger.Level.FULL;}}
解释:这里
@Configuration特意注释的原因:若标注了@Configuration并且被扫描到了,这个FULL级别将对所有的FeignClient接口生效
@FeignClient(name = "provider-nacos",contextId = "client1",configuration = ProviderClientConfig.class)public interface ProviderClient {@RequestMapping("test")String test();}
同时存在优先级问题
feign:client:config:default:loggerLevel: NONE
//@Configurationpublic class ProviderClientConfig {@Beanpublic Logger.Level loggerLevel(){return Logger.Level.FULL;}}@FeignClient(name = "provider-nacos",contextId = "client1",configuration = ProviderClientConfig.class)public interface ProviderClient {@RequestMapping("test")String test();}
上面情况一旦发生,配置类是无效的。所以日志是不打印的,如果想让配置类优先于yaml,则需要在yaml中配置:
feign.client.default-to-properties=false,具体只要修改application.yml为下面内容
feign:client:default-to-properties: falseconfig:default:loggerLevel: NONE
