图中getClientConfig方法就是判断使用Feign或者Ribbon配置的核心逻辑
核心的判断逻辑就是这一行
options == DEFAULT_OPTIONS
DEFAULT_OPTIONS就是一个超时时间的常量
当上述判断条件成立时,就会通过this.clientFactory.getClientConfig(clientName)获取到Ribbon配置
由于这是Ribbon的逻辑,这里就不深扒了,知道是这个意思就行
当条件不成立时,用Options构建一个FeignOptionsClientConfig
FeignOptionsClientConfig就是简单地将Options配置读出来,设置到父类DefaultClientConfigImpl超时时间配置上
DefaultClientConfigImpl就算你不知道是什么也无所谓,你能看出的一件事就是,超时时间用的是传递给Client的Options参数
所以,综上,我们的问题就变得非常easy了,那就是什么时候
options == DEFAULT_OPTIONS
只有当这个条件成立时,才使用Ribbon的配置。
这里我们先来捋一捋前面提到的东西
前面我们反复提到,Client的Options最终只来自于两种配置
- Feign.Builder
- 方法参数
所以DEFAULT_OPTIONS这个Options一定是通过上面两种方法中的其中一种设置的
而方法参数是不可能设置的成DEFAULT_OPTIONS
因为这是我们控制的,只要我们参数不传DEFAULT_OPTIONS,那么永远都不可能是DEFAULT_OPTIONS。
此时只剩下一种情况,那就是Spring在构建在Feign.Builder的时候,设置成DEFAULT_OPTIONS。
通过查找DEFAULT_OPTIONS的使用,我们可以追踪到这么一段代码
这不就是前面提到的通过声明Bean的方式来设置超时时间
不同的是它加了@ConditionalOnMissingBean,这个注解就是说,一旦我们自己没有声明Options,就用他这个Options
到这终于真像大白了。
我们不设置超时时间,Spring就会给Feign.Builder加一个DEFAULT_OPTIONS这个Options
在执行的时候,发现是DEFAULT_OPTIONS,说明我们没有主动设置过超是时间,就会使用Ribbon的超时时间。
为了方便理清上面的逻辑,这里整一张图