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: BASIC
client1:
loggerLevel: FULL
client2:
loggerLevel: NONE
logging:
level:
com.gao.consumernacosdemo.client: debug
解释:
- default:指定默认的日志级别为BASIC
- client1:指定contextId为cleint1的FeignClient接口的日志级别为FULL
- cleint2:指定contextId为cleint2的FeignClient接口的日志级别为NONE
- 若开启Fegin日志必须将Feign接口的日志级别设置为debug
@RestController
public class ConsumerNacosDemoController {
@Autowired
private ProviderClient providerClient;
@Autowired
private ProviderClient2 providerClient2;
@Autowired
private 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
//@Configuration
public class ProviderClientConfig {
@Bean
public 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
//@Configuration
public class ProviderClientConfig {
@Bean
public 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: false
config:
default:
loggerLevel: NONE