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时有效

      以上配置是默认配置的内容


  • Logger.Level:fegin调用日志打印级别,需要设置FeginClient接口类日志级别为DEBUG后生效
  • Retryer:重试次数
  • ErrorDecoder:
  • Request.Options:
  • Collection:请求拦截器,可以在请求前设置一些请求头信息
  • SetterFactory:
  • QueryMapEncoder:

    配置方式

    Fegin支持2种形式的自定义配置:YAML和配置类,下面我以配置日志打印级别为例来展示两种配置方式。

    YAML方式

    1. feign:
    2. client:
    3. config:
    4. default:
    5. loggerLevel: BASIC
    6. client1:
    7. loggerLevel: FULL
    8. client2:
    9. loggerLevel: NONE
    10. logging:
    11. level:
    12. com.gao.consumernacosdemo.client: debug

    解释:

    1. default:指定默认的日志级别为BASIC
    2. client1:指定contextId为cleint1的FeignClient接口的日志级别为FULL
    3. cleint2:指定contextId为cleint2的FeignClient接口的日志级别为NONE
    4. 若开启Fegin日志必须将Feign接口的日志级别设置为debug
  1. @RestController
  2. public class ConsumerNacosDemoController {
  3. @Autowired
  4. private ProviderClient providerClient;
  5. @Autowired
  6. private ProviderClient2 providerClient2;
  7. @Autowired
  8. private ProviderClient3 providerClient3;
  9. @RequestMapping("testFegin")
  10. public String testFegin() {
  11. return providerClient.test();
  12. }
  13. @RequestMapping("testFegin2")
  14. public String testFegin2() {
  15. return providerClient2.test();
  16. }
  17. @RequestMapping("testFegin3")
  18. public String testFegin3() {
  19. return providerClient3.test();
  20. }
  21. }
  1. @FeignClient(name = "provider-nacos",contextId = "client1")
  2. public interface ProviderClient {
  3. @RequestMapping("test")
  4. String test();
  5. }
  6. @FeignClient(name = "provider-nacos",contextId = "client2")
  7. public interface ProviderClient2 {
  8. @RequestMapping("test")
  9. String test();
  10. }
  11. @FeignClient(name = "provider-nacos",contextId = "client3")
  12. public interface ProviderClient3 {
  13. @RequestMapping("test")
  14. String test();
  15. }

配置类方式

  1. logging:
  2. level:
  3. com.gao.consumernacosdemo.client: debug
  1. //@Configuration
  2. public class ProviderClientConfig {
  3. @Bean
  4. public Logger.Level loggerLevel(){
  5. return Logger.Level.FULL;
  6. }
  7. }

解释:这里@Configuration特意注释的原因:若标注了@Configuration并且被扫描到了,这个FULL级别将对所有的FeignClient接口生效

  1. @FeignClient(name = "provider-nacos",contextId = "client1",configuration = ProviderClientConfig.class)
  2. public interface ProviderClient {
  3. @RequestMapping("test")
  4. String test();
  5. }

同时存在优先级问题

  1. feign:
  2. client:
  3. config:
  4. default:
  5. loggerLevel: NONE
  1. //@Configuration
  2. public class ProviderClientConfig {
  3. @Bean
  4. public Logger.Level loggerLevel(){
  5. return Logger.Level.FULL;
  6. }
  7. }
  8. @FeignClient(name = "provider-nacos",contextId = "client1",configuration = ProviderClientConfig.class)
  9. public interface ProviderClient {
  10. @RequestMapping("test")
  11. String test();
  12. }

上面情况一旦发生,配置类是无效的。所以日志是不打印的,如果想让配置类优先于yaml,则需要在yaml中配置:feign.client.default-to-properties=false,具体只要修改application.yml为下面内容

  1. feign:
  2. client:
  3. default-to-properties: false
  4. config:
  5. default:
  6. loggerLevel: NONE