今天项目现场提过来一个问题 “公司发过来的封装好的 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=5000feign.client.config.default.read-timeout=30000
(单位毫秒)
4、当前代码工程中有好几个 @FeignClient 声明,分别调用了不同的其他服务,如果要单独为这个 shanhy-id
服务设置这两个超时时间,那么对应的配置方法如下:
feign.client.config.shanhy-id.connect-timeout=2000feign.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=3000feign.client.config.shanhy-id-2.read-timeout=15000
其实系统启动的时候,会为每一个 @FeignClient 定义的接口形成代理类然后进行配置,
contextId
是当前 FeignClient 相关参数在 FeignContext 上下文中的 key,通过 contextId 来区分不同 FeignClient 的配置,如果 contextId 没有配置则使用 name 作为上限文中的 key,与超时时间之外的其他相关配置详见FeignClientConfiguration
至此,问题解决。