所以,如果你使用了SpringCloud提供的方式来使用Feign,那么就可以通过声明OptionsBean和配置文件的方式更加方便地来设置超时时间
最终其实还是通过Feign.Builder来设置的
SpringCloud下通过Ribbon来设置当Feign配合Ribbon使用时,除了上面两种方式之外,还可以通过Ribbon来设置超时时间。
但是这里我不知道你会不会好奇
Ribbon不是负载均衡组件,怎么可以设置超时时间?
其实这跟Ribbon的定位有关,除了负载均衡组件之外,Ribbon也干发送Http请求的事,也就是不配合Feign,他照样可以发送http请求。
来个简单demo
解释一下上面的代码意思
- 第一步,设置user服务的两个服务实例地址
- 第二步,获取user服务对应的RestClient,这RestClient就可以用来发送http请求
- 第三步,构建一个http请求
- 第四步,就是发送http请求,以负载均衡的方式
这样,此时就会从两个服务实例中根据负载均衡选取一个服务地址发送http请求,
Ribbon既然可以发送Http请求,那么自然而然就可以设置超时时间
Feign在整合Ribbon的时候,为了统一配置,就默认将自己的超时时间交由Ribbon管理
所以,在默认情况下,Feign的超时时间可以由Ribbon配置
而Ribbon默认连接和读超时时间只有1s,所以在默认情况下,Feign的超时时间只有1s。
IClientConfig是Ribbon的配置类,Ribbon所有的配置都可以从IClientConfig中获取。
所以,在默认情况下,很容易就发生超时,不过我们可以通过配置文件修改即可
ribbon:
ConnectTimeout: 5000
ReadTimeout: 5000
你知道你发现没,上面说通过Ribbon设置Feign的超时时间,一直提到前面一直提到这个词
默认
什么情况下叫默认呢?
所谓的默认,就是当你不主动设置Feign的超时时间的时候,就是默认。
换句话说,一旦你通过上面说的那些配置方式设置Feign的超时时间,就不是默认了
此时通过Ribbon设置的超时时间就不会生效了
Feign是如何在默认情况下将超时时间交给Ribbon管理的?要想回答这个问题,就得先搬出前面反复提到的Client接口了。
在SpringCloud的环境下,有一个Client的实现,叫LoadBalancerFeignClient
通过名字就可以看出,带有负载均衡的Client实现,负载均衡的实现肯定是交给Ribbon来实现的
所以当Feign配合Ribbon时用的就是这个Client实现
既然实现了Client接口,那就看看execute方法的实现逻辑