本文已参与「新人创作礼」活动,一起开启掘金创作之路。
5. 获取FeignClient
- 注册BeanDefinition
- 注册全局默认的FeignConfiguration
- 注册@FeignClient独立的FeignClientSepcification
- 注册@FeignClient独立的FeignClientFactoryBean
- 获取继承NamedContextFactory的FeignContext
- 创建Feign.builder对象
- 生成负载均衡代理类
- 生成默认代理类
- 注入到spring容器
获取整合Ribbon的Feign.Client
FeignClient注解被@Target(ElementType.TYPE)修饰,表示FeignClient注解的作用目标在接口上
name:指定FeignClient的名称,如果项目使用Ribbon,会作为微服务的名称,用于服务发现。
url:一般用于调试程序,允许手动指定@FeignClient调用的地址。
path:定义当前FeignClient的统一前缀。方便在该FeignClient中的@RequestMapping中书写value值。
primary:是否将伪代理标记为主Bean,默认为true
通过FeignContext,构造Feign.Builder。
FeignContext context = this.applicationContext.getBean(FeignContext.class);
Feign.Builder builder = feign(context);
默认配置类、默认配置属性,构造Feign.Builder。
根据默认配置类构造Feign.Client。
如果在@FeignClient上,没有配置url属性,也就是自定义指定服务的url地址,自动跟Ribbon关联起来,采用Ribbon来进行负载均衡,为Ribbon准备对应的url地址:http://eureka-provider-ribbon-feign-api-impl
@FeignClient注解的path属性
如果要访问的是eureka-provider-ribbon-feign-api-impl服务的某一类接口,@FeignClient(value = “eureka-provider-ribbon-feign-api-impl”, path = “/facade”),拼接请求URL地址的时候,就会拼接成:http://eureka-provider-ribbon-feign-api-impl/user
调用loadbalance()方法,用ribbon支持负载均衡,基于ribbon进行负载均衡的动态代理。
构造HardCodedTarget,包含接口类型(center.leon.eurekaconsumerribbonfeignapi.product.server.ProductFacadeServiceFeign)、服务名称(eureka-provider-ribbon-feign-api-impl)、url地址(http://eureka-provider-ribbon-feign-api-impl),跟Feign.Builder、FeignContext,一起,传入loadBalance()方法。
Feign.Client,从FeignContext里面获取Feign.Client。
spring-cloud-openfeign-core-2.2.1.RELEASE.jar
spring.factories
org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration
@Import({ HttpClientFeignLoadBalancedConfiguration.class, OkHttpFeignLoadBalancedConfiguration.class, DefaultFeignLoadBalancedConfiguration.class })
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, SpringClientFactory clientFactory)
LoadBalancerFeignClient
\
DefaultFeignLoadBalancedConfiguration.class
HttpClientFeignLoadBalancedConfiguration.class
OkHttpFeignLoadBalancedConfiguration.class
Feign 在默认情况下使用 JDK 原生的 URLConnection 发送HTTP请求。(没有连接池,保持长连接) 。
可以通过修改 Client 依赖换用底层的 Clien。
HttpClientFeignLoadBalancedConfiguration.class,要求feign.httpclient.enabled属性设置为true
OkHttpFeignLoadBalancedConfiguration.class,要求feign.okhttp.enabled属性设置为true
DefaultFeignLoadBalancedConfiguration.class,默认ConditionalOnMissingBean
@Configuration(proxyBeanMethods = false)
class DefaultFeignLoadBalancedConfiguration {
@Bean
@ConditionalOnMissingBean
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory) {
return new LoadBalancerFeignClient(new Client.Default(null, null), cachingFactory,
clientFactory);
}
}