首页 > 编程语言 >openfeign源码浅析

openfeign源码浅析

时间:2023-02-19 00:22:40浏览次数:30  
标签:FeignClient feign 调用 openfeign spring 接口 源码 方法 浅析

问题:

1.@FeignClient怎么解析的。

2.@FeignClient注解的接口放到spring容器里存的是什么。

3.调用@FeignClien接口的方法是怎么执行的

 

1.@FeignClient怎么解析的?

首先从@EnableFeignClients入手,这个注解里面引入了FeignClientsRegistrar,这个类实现了ImportBeanDefinitionRegistrar,ImportBeanDefinitionRegistrar这个类主要是注册bean到spring容器的,所以到这里,大概猜测是解析@feignClient接口的类后,把解析的结果注册到spring容器。按照这个猜想继续往下看。

 

 

 

 

 走到registerBeanDefinitions方法,有两个方法registerDefaultConfiguration,registerFeignClients。registerDefaultConfiguration主要干的事情是:如果@EnableFeignClients注解中的defaultConfiguration不为空,则注入到spring容器中。而registerFeignClients方法则是注入FeignClient的地方。

 

进入registerFeignClients,这里会扫描@EnableFeignClients所在类的包及其子包下的标记了@FeignClient类,调用registerFeignClient方法,将被@rFeignClient标注的接口注入到IOC容器中,注入的是FeignClientFactoryBean

 

 

 

 

 

 

 

 

2.@FeignClient注解的接口放到spring容器里存的是什么?

@FeignClient注解的接口放到spring容器里存的是什么,是一个FeignClientFactoryBean但在用@Autowired注入需要实例化的地方,spring在启动时,会调用FactoryBean的getObject方法,getObject方法主要是生成动态代理类:

从Spring上下文中,获取FeignContext这个Bean,这个bean是在哪里注册的呢?是在FeignAutoConfiguration中注册的。 然后判断url属性是否为空,如果不为空,则生成默认的代理类;如果为空,则走负载均衡,生成带有负载均衡的代理类。那么重点关注loadBalance方法。

 

 

 首先调用getOptional方法,这个方法就是根据contextId,获取一个子上下文,然后从这个子上下文中查找Client bean,SpringCloud会为每一个feignClient创建一个子上下文,然后存入以contextId为key的map中(NamedContextFactorygetContext方法)。此处会返回LoadBalancerFeignClient这个Client。FeignRibbonClientAutoConfiguration会导入相关配置类。 然后会从子上下文中,查找Targeter bean,默认返回的是DefaultTargeter, 最后调用target方法。

 

 

 

 

 

所以在@Autowired注入的时候,是注入的标记@FeignClient接口的动态代理类。当在自己的业务类中调用feign接口方法时,会调用FeignInvocationHandlerinvoke方法。

3.那注入完成后,OpenFeign远程调用是怎样的呢?

从初始化的流程来看 feign.MethodHandler是feign.SynchronousMethodHandler,而java.lang.reflect.InvocationHandler是feign.ReflectiveFeign.FeignInvocationHandler,然后在调用方法时 首先要进入的就是feign.ReflectiveFeign.FeignInvocationHandler#invoke

 

 

 下面的代码中有一个 executeAndDecode()方法,该方法通过RequestTemplate生成Request请求对象,然后利用Http Client(默认)获取response,来获取响应信息

 

 

 

 

 

 client.execute(request, options);默认使用HttpURLConnection发起远程调用,这里的client为LoadBalancerFeignClient。看他的execute方法,最终通过Ribbon负载均衡器发起远程调用。

 

标签:FeignClient,feign,调用,openfeign,spring,接口,源码,方法,浅析
From: https://www.cnblogs.com/lufei-123/p/17134069.html

相关文章

  • 【Spring IOC】【七】容器源码解析- PostConstruct、PreDestory的源码分析
    1 前言@PostConstruct、@PreDestory这两个注解大家应该有用过吧,我们这篇分析一下主要是PostConstruct这个注解的解析时机和执行时机。2 源码分析2.1 解析时机-doC......
  • 【Spring IOC】【六】容器源码解析- initializeBean剩下的初始化工作
    1 前言我们的bean经过的应该就剩下initializeBean这个方法,这个方法对上一步的populateBean属性填充完,做最后的剩余工作,这个里边的东西相比之前几个那可真是让人看着开心......
  • Swift源码转PlantUML
    brewinstallswiftplantuml https://github.com/MarcoEidinger/SwiftPlantUML  在文件目录下执行swiftplantuml./*.swift 然后就会打开 https:......
  • 参考iictools源码实现HP203b气压温度传感器读取
    参考i2ctools源码实现HP203B气压温度传感器读取由于开发的设备中要用到HP203B气压温度传感器,此设备要用到i2c协议进行数据的读取,我将以韦东山老师课程为指引,参考经典的i2c......
  • SpringMVC源码(九):无异常View视图解析
    在MVC请求流程中,处理Controller控制器逻辑后获取到的ModelAndView对象并不能直接返回到浏览器,需要通过对ModelAndView中的View属性做解析获取视图,并用Model属性中的数......
  • 【Spring IOC】【五】容器源码解析- 属性填充populateBean
    1 前言好了,我们这篇文章讲解下populateBean,也就是bean的属性填充,并不仅仅是设置值,还有很多事情要做的。比如你的属性值类型转换、表达式解析等,关于属性填充的一些知识,本......
  • linux源码解析13- 反向映射RAMP详解
    1.什么是反向映射是一种物理地址反向映射虚拟地址的方法;正向映射:用户访问的虚拟地址,经过多级页表转化,最终映射到物理页面;反向映射:根据物理页面,找到所有映射到这个页面的......
  • floor报错注入浅析
    常见报错语句:selectcount(*),(floor(rand(0)*2))xfrominformation_schema.tablesgroupbyx;1通过concat函数连接注入语句与floor(rand(0)*2)函数,实现将注入结果与报......
  • ZYNQ FSBL源码分析
    ​ FSBL是ZYNQ的bootloader虽然不是第一个启动的,但属于用户可以更改的启动程序,因此对源码分析是非常有必要的(在FSBL之前有bootRom,这个已经固化)zynq在运行完芯片内固......
  • 摄像头视频云台控制PTZ前端html css原生样式源码分享
        ​<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0">......