SpringBoot 关于Feign的超时时间配置

无独有偶,我今天也遇到了一个关于 feign 超时时间配置的问题。

今天项目现场提过来一个问题 “公司发过来的封装好的 springboot 项目中的 feign 调用超时时间需要修改”,细问之后,具体的需求场景是这样的:
1、首先要对 feign 的超时时间做设置
2、然后具体的要求是,只要对某一个微服务的其中一个接口进行特殊配置,对其余的所有接口做一个统一配置

公司 feign 版本 spring-cloud-starter-openfeign 2.2.3.RELEASE ,其他版本自行尝试
基于 @FeignClient 的声明式接口调用

一个实际的代码示例:

@FeignClient(name = "${microservice.servicename.id:shanhy-id}", path = "/${microservice.servicename.id:shanhy-id}",
url = "${microservice.serviceurl.id:}")
public interface IdFeignClient {
   (代码略)
}

顺着这个问题,我思考了一下,扒了下 feign 调用的相关源码,下面直接给出结论(因为比较忙时间有限这里就不做源码分析了):
1、feign 调用与超时有关的参数分为 连接超时时间 connect-timeout 和 读取超时时间read-timeout
2、这两个参数的默认值分别为 10秒 和 60秒
3、如果要对这两个参数进行配置,那么对应的配置方法如下

feign.client.config.default.connect-timeout=5000
feign.client.config.default.read-timeout=30000

(单位毫秒)

4、当前代码工程中有好几个 @FeignClient 声明,分别调用了不同的其他服务,如果要单独为这个 shanhy-id 服务设置这两个超时时间,那么对应的配置方法如下:

feign.client.config.shanhy-id.connect-timeout=2000
feign.client.config.shanhy-id.read-timeout=5000

注意和默认的区别就是中间那一段,将 default 替换为 shanhy-id,这个和 @FeignClient 中的 name 属性一致

5、如果需要针对某一个服务中的某一个或几个接口做特殊配置,那么就为这个特殊接口单独写一个 @FeignClient 接口定义,并为设置一个 contextId 设置一个和 name 不重名的名字,保证唯一,下面是例子:

@FeignClient(name = "${microservice.servicename.id:shanhy-id}", path = "/${microservice.servicename.id:shanhy-id}",
url = "${microservice.serviceurl.id:}", contextId = "shanhy-id-2" )
public interface IdFeignClient {
   (代码略)
}

然后对应的配置为:

feign.client.config.shanhy-id-2.connect-timeout=3000
feign.client.config.shanhy-id-2.read-timeout=15000

其实系统启动的时候,会为每一个 @FeignClient 定义的接口形成代理类然后进行配置,contextId 是当前 FeignClient 相关参数在 FeignContext 上下文中的 key,通过 contextId 来区分不同 FeignClient 的配置,如果 contextId 没有配置则使用 name 作为上限文中的 key,与超时时间之外的其他相关配置详见 FeignClientConfiguration

至此,问题解决。


(END)

猜你喜欢

转载自blog.csdn.net/catoop/article/details/107698575