参考资料:Spring Cloud 官网
相关版本:Spring Boot 2.1.5.RELEASE 、Spring Cloud Greenwich.SR
回顾
在 Spring Cloud Feign【源码篇】Feign 如何进行服务间请求调用 中,提到了 Feign 如何进行服务调用的。
Feign 在封装了相关的请求参数 RequestTemplate 后,发起服务远程请求调用。 代码如下:
final class SynchronousMethodHandler implements MethodHandler {
private final Client client;
Object executeAndDecode(RequestTemplate template) throws Throwable {
// 拼装完整的 request 请求
Request request = targetRequest(template);
// 发起请求,并获取返回结果 Response
response = client.execute(request, options);
// 解析 response 请求,获取最后的结果
Object result = decode(response);
// 响应返回结果
return result;
}
}
从源码中可以很直观的看到真正发起服务请求调用的是 feign.Client#execute
以 feign.Client#execute 为切入点,进行分析。
Feign 选择 Ribbon 作为负载均衡客户端
查看 feign.Clien 源码,feign.Client 是一个接口,它有两个实现类
-
feign.Client.Default
-
org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient
其中 LoadBalancerFeignClient 为 Ribbon 负载均衡客户端实现类。
Feign 是如何注册 LoadBalancerFeignClient 作为其客户端调用实现的。首先想到的就是自动配置类 FeignRibbonClientAutoConfiguration。
聚焦 FeignRibbonClientAutoConfiguration
@ConditionalOnClass({
ILoadBalancer.class, Feign.class })
@Configuration
@AutoConfigureBefore(FeignAutoConfiguration.class)
@EnableConfigurationProperties({
FeignHttpClientProperties.class })
@Import({
HttpClientFeignLoadBalancedConfiguration.class,
OkHttpFeignLoadBalancedConfiguration.class,
DefaultFeignLoadBalancedConfiguration.class })
public class FeignRibbonClientAutoConfiguration {
@Bean
@Primary
@ConditionalOnMissingBean
@ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate")
public CachingSpringLoadBalancerFactory cac