Netflix Feign - Spring Cloud 整合 Feign 源码(四)

116 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


5. 获取FeignClient

  1. 注册BeanDefinition
    1. 注册全局默认的FeignConfiguration
    2. 注册@FeignClient独立的FeignClientSepcification
    3. 注册@FeignClient独立的FeignClientFactoryBean
  2. 获取继承NamedContextFactory的FeignContext
  3. 创建Feign.builder对象
  4. 生成负载均衡代理类
  5. 生成默认代理类
  6. 注入到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);
	}

}