spring cloud可以单独给每个微服务设置时间,例如服务a调b和c,调b超时时间为2秒,调c超时时间为3秒
项目中设置了feign超时时间,但是发现没有生效
feign:
client:
config:
user:
loggerLevel: FULL
readTimeout: 12000
@FeignClient(name = "user", contextId = "userFeign")
public interface AdminUserFeign {
@GetMapping("/admin/v1/user/{id}")
R<UserVo> getUserInfo(@PathVariable("id") Integer userId);
}
后跟踪了一下源码,发现超时时间是在这里配置的FeignClientProperties
protected void configureFeign(FeignContext context, Feign.Builder builder) {
FeignClientProperties properties = beanFactory != null
? beanFactory.getBean(FeignClientProperties.class)
: applicationContext.getBean(FeignClientProperties.class);
FeignClientConfigurer feignClientConfigurer = getOptional(context,
FeignClientConfigurer.class);
setInheritParentContext(feignClientConfigurer.inheritParentConfiguration());
if (properties != null && inheritParentContext) {
if (properties.isDefaultToProperties()) {
configureUsingConfiguration(context, builder);
configureUsingProperties(
properties.getConfig().get(properties.getDefaultConfig()),
builder);
configureUsingProperties(properties.getConfig().get(contextId), builder);
}
else {
configureUsingProperties(
properties.getConfig().get(properties.getDefaultConfig()),
builder);
configureUsingProperties(properties.getConfig().get(contextId), builder);
configureUsingConfiguration(context, builder);
}
}
else {
configureUsingConfiguration(context, builder);
}
}
关键在于:properties.getConfig().get(contextId),从map中获取配置信息,这个key,对应的是feign里面的contextId而不是name(微服务名字),因此配置文件改为如下就解决了
feign:
client:
config:
userFeign:
loggerLevel: FULL
readTimeout: 12000