Feign源码解析

1. Feign源码解析

1.1. 启动过程

1.1.1. 流程图

751560-20190416175019779-1606592793.png

1.1.2. 解释说明

  1. Feign解析过程依赖Spring的初始化,它通过实现ImportBeanDefinitionRegistrar接口,来解析注解并进行加载
  2. 自动配置过程和很多框架一样,通过xxxAutoConfiguration进行初始化配置,这里我使用了Hystrix,所以还会额外初始化Hystrix并进行动态代理包装
  3. 同时它实现了一个FactoryBean,对Feign进行包装,之后我们使用的xxxFeign都是包装过的HardCodedTarget,如下图

751560-20190416175232691-1815460197.png

1.2. 调用过程

  1. String tom = portFeign.feignTest("Tom");进入到ReflectiveFeign类的代理方法
  2. 之后根据调用方法全称找到对应处理器SynchronousMethodHandler
  3. 之后会经过拦截器,该拦截器默认是null的,可以自定义配置
    751560-20190424112746058-268419355.png
  4. 再进入请求模板RequestTemplateRequest.create(this.method, this.url(), this.headers(), this.requestBody());
  5. 真正进行请求的,是LoadBalancerFeignClient负载均衡客户端,它来负责解析服务和发送请求

1.2.1. 拦截器

  1. 加载位置
    751560-20190424135836392-190213628.png

  2. 至于拦截器由谁加载,先看FeignClientFactoryBean类,它集成了FactoryBean,所以他实现了getObject方法
    751560-20190424140952565-657750152.png
    751560-20190424141025521-1524651666.png
    751560-20190424141141924-72831847.png
    751560-20190424141239162-1474556006.png

1.2.2. FeignClientFactoryBean初始化过程

  1. 我们知道,客户端需要加注解@EnableFeignClients,内容如下
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
  1. 它会加载FeignClientsRegistrar类的实例化,而FeignClientsRegistrar实现了接口ImportBeanDefinitionRegistrar,因此,一旦spring一旦实例化它,后续会调用registerBeanDefinitions方法
    751560-20190424142344600-1163497450.png

1.3. 启动过程总流程图

https://www.processon.com/view/link/5cb5790ae4b0841b843185a6

Github地址:https://github.com/tzxylao/learn-demo

转载于:https://www.cnblogs.com/sky-chen/p/10718759.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值