zoukankan      html  css  js  c++  java
  • SpringCloud远程调用客户端之Feign源码剖析

    前面我们看过了springcloud熔断器注册中心以及负载均衡,本文我们来看一下springcloud的远程调用客户端Feign的源码

    入口org.springframework.cloud.openfeign.EnableFeignClients

     从注释上我们可以看到这个注解的作用就是扫描feign客户端以及配置信息,并且引入了

    org.springframework.cloud.openfeign.FeignClientsRegistrar

    接下来我们进入里面看看里面做了啥

    嗯?这不是刚刚我们说的那两个事吗?1、扫描配置类信息;2、扫描客户端

    接下来我们看看他是如何扫描配置类信息的

     可以看到,这里主要就是解析org.springframework.cloud.openfeign.EnableFeignClients注解的属性信息,然后获取默认配置进行注册

    进入org.springframework.cloud.openfeign.FeignClientsRegistrar#registerClientConfiguration

     可以看到这里就是把配置类注入到spring容器里

    接下来我们看看第二件事扫描feign客户端

    进入org.springframework.cloud.openfeign.FeignClientsRegistrar#registerFeignClients

      

    可以看到这里也就是扫描包含feignClient的类进行注册

    接下来进入org.springframework.cloud.openfeign.FeignClientsRegistrar#registerFeignClient中

     可以看到这里主要就是封装一个BeanDefinition然后使用工具进行注册,bean注册这里我们就不用关心了,最终他就是注册到容器里

    到这里我们EnableFeignClients注解做的是基本就完事了

    接下来我们看一下feign的自动装配都做了啥

    进入org.springframework.cloud.openfeign.FeignAutoConfiguration

     

     这里注入了一个feign上下文

    进入org.springframework.cloud.openfeign.FeignContext这里看看这里都干了啥

      哦,他告诉我们这里创建了一个feign的实例工厂,并且可以从spring上下文获取到feign的实例。

    到这里我们初始化阶段就基本完了,接下来我们看看我们是如何从spring容器中获取到一个feign客户端的

    回到org.springframework.cloud.openfeign.FeignClientsRegistrar#registerFeignClients

    我们发现在封装BeanDefinition的时候传入了一个工厂

     我们都知道工厂bean主要是用来获取bean用,我们去看看他是怎们获取一个bean的

    进入org.springframework.cloud.openfeign.FeignClientFactoryBean#getObject

     

    进入org.springframework.cloud.openfeign.FeignClientFactoryBean#getTarget

     可以看到这里主要就是获取一个feign上线文,然后利用上下文获取一个构造器,最后调用org.springframework.cloud.openfeign.FeignClientFactoryBean#loadBalance

    那么我们想一下这个org.springframework.cloud.openfeign.FeignClientFactoryBean#loadBalance方法里做了啥

     这里可以看到,主要是使用feign上下文获取一个客户端然后给构造器设置上最后获取一个目标,调用目标的targer方法

    接下来我们看看这个target方法,进入org.springframework.cloud.openfeign.HystrixTargeter#target

     继续跟进,进入feign.Feign.Builder#target

     进入feign.Feign.Builder#build

     哦这里直接创建了一个feign

     再看一下feign.ReflectiveFeign#newInstance

     哦,这块就熟悉了吧,他先把目标对象的方法拿出来进行一个封装,然后使用动态dialing创建一个代理对象进行返回

    通过前两张图我们可以知道这个handler就是feign.SynchronousMethodHandler

    到这里我们就知道了如何获取一个feign客户端,我们接下来看看他是如何进行调用的呢?

    从上面获取客户端的过程中我们就知道他是获取到的是一个feign.ReflectiveFeign代理对象

    那么我们猜想ReflectiveFeign这里是不是有一个调用的方法呢?

     果然啊,这里确实有一个invoke方法

    进入feign.InvocationHandlerFactory

     进入feign.SynchronousMethodHandler#invoke

     

     进入feign.SynchronousMethodHandler#executeAndDecode

     进入org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient#execute

    这里主要就是获取客户端基本信息然后进行调用

    进入org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient#lbClient

    进入org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory#create

     这里主要就是创建客户端并放入缓存

    我们回到org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient#execute看看是怎么执行的呢

    进入com.netflix.client.AbstractLoadBalancerAwareClient#executeWithLoadBalancer

     好吧,到了这里我就无法继续跟进了,因为后面的都看不懂。。。。这就又回到了RxJava了。

    但是我们回到org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient可以发现他实现了Client接口

     我们跟进去看看,里面会不会发现什么

     看到这里,大家应该可以大胆的猜想,这会不会使用的是http进行发送的请求呢?

    跟进去看看

     

     哈哈哈,果不其然

  • 相关阅读:
    jq获取img高度(动态生成的image高度为0原因)
    Idea集成使用SVN教程
    RPC框架pigeon源码分析
    java多线程面试题整理及答案
    深入理解JVM线程模型
    dubbo 2.8.4(dubbox)的jar包制作【添加到maven本地仓库】
    【学习】027 Dubbo
    【学习】026 Zookeeper
    【学习】025 RocketMQ
    【学习】024 springCloud
  • 原文地址:https://www.cnblogs.com/qsky/p/13863237.html
Copyright © 2011-2022 走看看