feign.Client客户端容器实例
前面介绍了常用的Feign客户端实现类,大致如下:
(1)Client.Default类:默认的实现类,使用JDK的HttpURLConnnection类提交HTTP请求。
(2)ApacheHttpClient类:该客户端类在内部使用ApacheHttpClient开源组件提交HTTP请求。
(3)OkHttpClient类:该客户端类在内部使用OkHttp3开源组件提交HTTP请求。
(4)LoadBalancerFeignClient类:内部使用Ribbon负载均衡技术完成HTTP请求处理。
Feign在启动时有两个与feign.Client客户端实例相关的自动配置类,根据多种条件组合装配不同类型的feign.Client客户端实例到Spring IOC容器,这两个自动配置类为
FeignRibbonClientAutoConfiguration和FeignAutoConfiguration。
装配LoadBalancerFeignClient负载均衡容器实例
详细来看,Feign涉及的与Client相关的两个自动配置类具体如下:
(1)
org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration:此自动配置类能够配置具有负载均衡能力的FeignClient容器实例。
(2)
org.springframework.cloud.openfeign.FeignAutoConfiguration:此自动配置类只能配置原始的FeignClient客户端容器实例。
事实上,第一个自动配置类
FeignRibbonClientAutoConfiguration在容器的装配次序上优先于第二个自动配置类FeignAutoConfiguration。
为了达到高可用,Spring Cloud中一个微服务提供者至少应该部署两个以上节点,从这个角度来说,LoadBalancerFeignClient容器实例已经成为事实上的标配。
具体可以参见
FeignRibbonClientAutoConfiguration源码,节选如下:
import com.netflix.loadbalancer.ILoadBalancer;
...
@ConditionalOnClass({ILoadBalancer.class, Feign.class})
@Configuration
@AutoConfigureBefore({FeignAutoConfiguration.class}) //本配置类具备优先权
@EnableConfigurationProperties({FeignHttpClientProperties.class})
@Import({
HttpClientFeignLoadBalancedConfiguration.class,//配置:包装ApacheHttpClient实例的负载均衡客户端
OkHttpFeignLoadBalancedConfiguration.class, //配置:包装OkHttpClient实例的负载均衡客户端
DefaultFeignLoadBalancedConfiguration.class //配置:包装Client.Default实例的负载均衡客户端
})
public class FeignRibbonCl