feign client三个客户端的自动装配

举报
周杰伦本人 发表于 2022/07/27 11:41:05 2022/07/27
【摘要】 feign client三个客户端的自动装配 FeignRibbonClientAutoConfiguration HttpClientFeignLoadBalancedConfiguration DefaultFeignLoadBalancedConfiguration OkHttpFeignLoadBalancedConfiguration 总结 feign client三个客户端的自...

feign client三个客户端的自动装配

我们在之前的文章中说了Feign的客户端有httpclient,OkHttpClient,Client.Default,下面就这三个客户端的自动装配进行分析一下。

FeignRibbonClientAutoConfiguration

FeignRibbonClientAutoConfiguration这个类配置FeignClient,从它的命名我们就可以看出来,它是具有负载均衡能力,可见关于类的命名见名知意是多么重要。

@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 cachingLBClientFactory(
      SpringClientFactory factory) {
    return new CachingSpringLoadBalancerFactory(factory);
  }

  @Bean
  @Primary
  @ConditionalOnMissingBean
  @ConditionalOnClass(name = "org.springframework.retry.support.RetryTemplate")
  public CachingSpringLoadBalancerFactory retryabeCachingLBClientFactory(
    SpringClientFactory factory,
    LoadBalancedRetryFactory retryFactory) {
    return new CachingSpringLoadBalancerFactory(factory, retryFactory);
  }

  @Bean
  @ConditionalOnMissingBean
  public Request.Options feignRequestOptions() {
    return LoadBalancerFeignClient.DEFAULT_OPTIONS;
  }
}

当ILoadBalancer类和Feign类存在的时候,FeignRibbonClientAutoConfiguration可以自动配置,同时导入HttpClientFeignLoadBalancedConfiguration、OkHttpFeignLoadBalancedConfiguration、DefaultFeignLoadBalancedConfiguration三个客户端的负载均衡配置类

HttpClientFeignLoadBalancedConfiguration

从HttpClientFeignLoadBalancedConfiguration这个类是对HttpClient的自动装配的配置类,类上的注解我们可以看到

@Configuration
@ConditionalOnClass(ApacheHttpClient.class)
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
class HttpClientFeignLoadBalancedConfiguration {
}

在存在ApacheHttpClient类和feign.httpclient.enabled=true可以实现httpclient的自动装配

DefaultFeignLoadBalancedConfiguration

这个类的定义:

@Configuration
class DefaultFeignLoadBalancedConfiguration {
  @Bean
  @ConditionalOnMissingBean
  public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
                SpringClientFactory clientFactory) {
    return new LoadBalancerFeignClient(new Client.Default(null, null),
        cachingFactory, clientFactory);
  }
}

从源码中我们可以看到默认自动装配是这个,从Client.Default看出实例使用HttpURLConnection来发起远程调用请求。

OkHttpFeignLoadBalancedConfiguration

这个类加载的条件:

@Configuration
@ConditionalOnClass(OkHttpClient.class)
@ConditionalOnProperty(value = "feign.okhttp.enabled")
class OkHttpFeignLoadBalancedConfiguration {
}

通过OkHttpFeignLoadBalancedConfiguration类上的注解,可以看到需要满足的条件的是存在OkHttpClient类,并且feign.okhttp.enabled=true,这样自动装配才会生效,实例内部通过OKHttp3完成http请求。

总结

本篇文章主要对Feign的三个客户端的自动配置类进行了源码层面的分析,对应的类的自动装配类分别是OkHttpFeignLoadBalancedConfiguration、DefaultFeignLoadBalancedConfiguration、HttpClientFeignLoadBalancedConfiguration,根据自动装配类的类上的注解,我们可以看出要想让哪个自动装配类生效,需要我们配置的条件是什么,以及需要引入的包有哪些,除了这个三个客户端外还有一个客户端是LoadBalancerFeignClient,它的内部是通过ribbon的负载均衡调度各个客户端完成Http请求的发送,而不是真正的客户端类。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。