spring cloud feign设计原理及代码解读

Spring Cloud源码解析

  • 什么是Feign

feign 是一种声明式的web 客户端,可以使用它的注解创建接口,它也支持

自定义编解码。Spring Cloud 集成了Ribbon 和Eureka 为客户端提供了负载均衡策略。Feign有两个主要注解: (@EnableFeignClients 用于开启feign功能,@FeignClient 用于定义feign 接口)。

    feign底层是使用了ribbon作为负载均衡的客户端,而ribbon的负载均衡也是依赖于eureka 获得各个服务的地址,所以一般和eureka-client一起使用。

  • 作用

feign是声明式的web service客户端,它让微服务之间的调用变得更简单

了,类似controller调用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。使用feign之后,我们调用eureka 注册的其他服务,在代码中就像各个service之间相互调用那么简单。

  • 原理简述

      spring cloud feign设计原理及代码解读

 

  1. 启动时,程序会进行包扫描,扫描所有包下所有@FeignClient注解的类,

并将这些类注入到spring的IOC容器中。当定义的Feign中的接口被调用时,通过JDK的动态代理来生成RequestTemplate。

  1. RequestTemplate中包含请求的所有信息,如请求参数,请求URL等。
  2. RequestTemplate声名Request,然后将Request交给client处理,这

个client默认是JDK的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。最后client封装成LoadBaLanceClient,结合ribbon负载均衡地发起调用。

  • 源码解析

(1)、架构图

  spring cloud feign设计原理及代码解读 

 

(2)、feign初始化扫描包原理

   Feign的使用是启动类上面@EnableFeignClient和api上面@FeignClient的搭配使用。@FeignClient是一个自定义注解。没什么可以讲的。@EnableFeignClient的核心是@Import(FeignClientRegistrar.class)。这里完成了堆@FeignClient的扫描和beeanDefination的定义

spring cloud feign设计原理及代码解读 

 

(3)、feign扫包的代码

spring cloud feign设计原理及代码解读 

 

核心方法是registerBeanDefinitions(),包含registerDefaultConfiguration(metadata,registry),拿到@EnableFeignClients的属性并注册配置bean,registerFeignClients(metadata,registry);扫@feignClient并注册

     spring cloud feign设计原理及代码解读 

 

  1. 得到scanner: ClassPathScanningCandidateComponentProvider
  2. GetBasePackages()得到包,默认是启动类同路径的包
  3. 声明FeignClient.class的AnnotationTypeFilter,加入到scanner
  4. 遍历packages, findCandidateComponents,判断是否满足注解filter
  5. Register到容器

     spring cloud feign设计原理及代码解读 spring cloud feign设计原理及代码解读

 

 

(4)、FeignClientFactoryBean类解析

 spring cloud feign设计原理及代码解读

spring cloud feign设计原理及代码解读 

spring cloud feign设计原理及代码解读 spring cloud feign设计原理及代码解读

spring cloud feign设计原理及代码解读 

 

 

 

 

 

(5)、代理实现的过程

spring cloud feign设计原理及代码解读 

spring cloud feign设计原理及代码解读 

spring cloud feign设计原理及代码解读 

spring cloud feign设计原理及代码解读 

 

 

 

 

 

 

(6)、代理invoke的实际执行过程

spring cloud feign设计原理及代码解读

spring cloud feign设计原理及代码解读 

 

 

 

 

 

 

 

spring cloud feign设计原理及代码解读 

spring cloud feign设计原理及代码解读 

spring cloud feign设计原理及代码解读 

spring cloud feign设计原理及代码解读 

spring cloud feign设计原理及代码解读 

小结:feign的原理主要有两个可以仔细研究的地方,一个是代理的实现方式,一个是ribbon的负载均衡的实现方式。当前仅是跟踪代码找到相应的位置,具体加深的理解还是需要结合实际场景去调试和研究。

以上资料原博客参考地址:https://segmentfault.com/a/1190000022710613

https://zhuanlan.zhihu.com/p/93745714

https://www.cnblogs.com/crazymakercircle/p/11965726.html