Feign源码深度刨析-(5)核心组件FeignClientFactoryBean(下)

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

“不积跬步,无以至千里。”

回顾一下,前面说了,把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(<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值