“不积跬步,无以至千里。”
回顾一下,前面说了,把Feign.Builder、context、HardCodedTarget 一起传入了一个loadBalance()方法里面,最后给 return 了,这个 return 的就是feign client的代理对象,然后注入给Controller的属性
这篇文章来着重分析一下 loadBalance() 方法
protected <T> T loadBalance(Feign.Builder builder, FeignContext context,
HardCodedTarget<T> target) {
Client client = getOptional(context, Client.class);
if (client != null) {
builder.client(client);
Targeter targeter = get(context, Targeter.class);
return targeter.target(this, builder, context, target);
}
throw new IllegalStateException(
"No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-netflix-ribbon?");
}
Client client = getOptional(context, Client.class);
上来从context(spring容器)中拿出来一个client,什么东东呢?就是Feign.Client,可见这个也是通过自动配置类注入的,找啊找,你把FeignAutoConfiguration、FeignClientsConfiguration这几个配置类都找遍了也没发现,最后在一个FeignRibbonClientAutoConfiguration 的配置类中似乎是找到了
@Bean
@ConditionalOnMissingBean
public Request.Options feignRequestOptions() {
return LoadBalancerFeignClient.DEFAULT_OPTIONS;
}
public Options() {
this(10000, 60000);
}
发现这竟然是默认的… … 真是找了个寂寞!!!
到这里,没什么线索,就要思考一下,@FeignClient的注解里面配置的不是url,而是服务名称,所以这一块肯定是跟ribbon整合的
org.springframework.cloud.netflix.feign.ribbon
结果在这个包下面,找到一个 DefaultFeignLoadBalancedConfiguration!!!
@Configuration
class DefaultFeignLoadBalancedConfiguration {
@Bean
@ConditionalOnMissingBean
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory) {
return new LoadBalancerFeignClient(new Client.Default(null, null),
cachingFactory, clientFactory);
}
}
这里spring容器中拿到的就是这个LoadBalancerFeignClient,拿到之后也给设置到 builder 中去了
然后 Targeter targeter = get(context, Targeter.class);
显然,就是从context 中拿到一个Targeter,然后我们在FeignAutoConfiguration这个配置类里面可以找到这个Targeter 的自动配置,代码如下
@Configuration
@ConditionalOnClass(name = "feign.hystrix.HystrixFeign")
protected static class HystrixFeignTargeterConfiguration {
@Bean
@ConditionalOnMissingBean
public Targeter feignTargeter() {
return new HystrixTargeter(<

本文详细剖析了Feign在整合 Ribbon 和 Hystrix 过程中的loadBalance 方法,揭示了默认配置与自定义整合的关键点,以及如何通过Spring Cloud组件实现负载均衡和熔断控制。
最低0.47元/天 解锁文章
869

被折叠的 条评论
为什么被折叠?



