Feign的工作原理

Feign是一个伪Java Http 客户端,Feign 不做任何的请求处理。Feign 通过处理注解生成Request模板,从而简化了Http API 的开发。开发人员可以使用注解的方式定制Request API模板。

在发送Http Request请求之前,Feign通过处理注解的方式替换掉Request模板中的参数,生成真正的Request,并交给Java Http客户端去处理。利用这种方式,开发者只需要关注Feign注解模板的开发,而不用关注Http请求本身,简化了Http请求的过程,使得Http请求变得简单和容易理解。

Feign通过包扫描注入FeignClient的Bean,该源码在FeignClientsRegistrar 类中。首先在程序启动时,会检查是否有@EnableFeignClients注解,如果有该注解,则开启包扫描,扫描被@FeignClient注解的接口。代码如下:

当程序的启动类上有@EnableFeignClients注解。在程序启动后,程序会通过包扫描将有@FeignClient注解修饰的接口连同接口名和注解的信息一起取出, 赋给BeanDefinitionBuilder,然后根据BeanDefinitionBuilder得到BeanDefinition,最后将BeanDefinition注入IoC容器中,源码如下:



注入BeanDefinition之后,通过JDK的代理,当调用Feign Cliet接口里面的方法时,该方法会被拦截,源码在ReflectiveFeign类:

在SynchronousMethodHandler类进行拦截粗粒,会根据参数生成RequestTemplate对象,该对象是Http请求的模板:

在上述代码中,有一个executeAndDecode()方法,该方法通过RequestTemplate生成Request请求对象,然后通过Http Client获取Response,即通过Http Client进行Http请求来获取响应:

总结

总的来说,Feign 的源码实现过程如下。

  1. 首先通过@EnableFeignClients注解开启FeignClient 的功能。只有这个注解存在,才会在程序启动时开启对@FeignClient注解的包扫描。
  2. 根据Feign的规则实现接口,并在接口上面加上@FeignClient注解。
  3. 程序启动后,会进行包扫描,扫描所有的@ FeignClient 的注解的类,并将这些信息注入IoC容器中。
  4. 当接口的方法被调用时,通过JDK的代理来生成具体的RequestTemplate模板对象。
  5. 根据RequestTemplate再生成Http请求的Request对象。
  6. Request 对象交给Client去处理,其中Client的网络请求框架可以是HtpURLConnection、HttpClient和OkHttp。
  7. 最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。

Feign的工作原理相关推荐

  1. SpringCloud Feign工作原理基本理解

    Feign介绍 Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端.Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均 ...

  2. Spring Cloud Hystrix 源码系列:工作原理

    Hystrix 译为 "豪猪",豪猪的棘刺能保护自己不受天敌伤害,代表了强大的防御能力.Hystrix 基于 RxJava 进行实现,RxJava 是一种基于观察者模式的响应式编程 ...

  3. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  4. 深入理解Nginx工作原理

    1 反向代理 1.1 概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给intern ...

  5. 高频开关电源原理_程控开关电源的工作原理

    本文介绍了开关电源的工作原理以及它的特点. 程控开关电源要要比线性电源复杂得多. 下图是典型的开关电源工作原理图. 首先对 220 V/50Hz 的 AC 输入,通过桥式整流器进行整流 储能电容对整流 ...

  6. Servlet生命周期与工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  7. java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...

  8. linux网络管理原理,Linux__网络管理(物理层 数据链路层 网络层工作原理)

    千锋云计算逆战班11点后打卡 今天学习后,进行复习下,物理层 数据链路层  网络层 的工作原理 物理层关心的两件事情:1.信号 2.介质 先说信号:信号分为模拟信号和数字信号 模拟信号: 模拟信号,不 ...

  9. HDD工作原理 导图

    以上导图介绍了我们使用的 (HDD)机械硬盘的基本构造以及核心工作原理,对于大家扫盲有所帮助 参考文档: https://blog.csdn.net/yizhaoxin/article/details ...

  10. 路由和交换机工作原理

    路由器与交换机的工作原理 计算机网络往往由许多种不同类型的网络互连连接而成.如果几个计算机网络只是在物理上连接在一起,它们之间并不能进行通信,那么这种"互连"并没有什么实际意义.因 ...

最新文章

  1. leetcode前缀树java_LeetCode 实现 Trie (前缀树)
  2. FPGA设计中MEMORY型数据怎么综合到blockRAM里面(二)
  3. 心得体悟帖---12、志向还是太短浅,目光也是
  4. [译] 如何使用纯函数式 JavaScript 处理脏副作用
  5. 从几何与代数的角度推算坐标旋转变换矩阵(以2维为例)
  6. 【论文解读】KDD20 | 图神经网络在生物医药领域的应用
  7. JavaUtils - 文件操作
  8. 【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)
  9. spring整合ehcache2.5.2缓存异常-- net.sf.ehcache.CacheException
  10. ubuntun 16.04 AttributeError: type object 'Callable' has no attribute '_abc_registry'
  11. Linux命令——cut命令学习
  12. gettid()和pthread_self()的区别
  13. Lock(ReentrantLock)实现线程同步,线程安全
  14. 【Oracle】Rman备份策略
  15. numpy array
  16. 4米乘以12米CAD图_实例讲解CAD制图比例
  17. Windows命令行工具cmder配置
  18. libtorrent安装windows版
  19. 网易暴力裁员事件 网易员工疑遭网易暴力裁员
  20. Win7下装centos7

热门文章

  1. java基于springboot+vue的学生宿舍报修管理系统(源码+数据库+Lw文档)
  2. cad.net 更改高版本填充交互方式为低版本样子
  3. mybatisplus修改某个字段_mybatisplus 怎么修改数据
  4. 解决MySQL登录1045错误
  5. php获取当前页面链接_php怎么获取当前完整url地址
  6. cad批量选择相同块_怎样在cad中快速选定同一个块的所有对象?
  7. mysql proxy maxscale_maxscale参数配置
  8. 【小白】线性表的链式存储结构的实现(C语言版)
  9. 激光条纹中心提取——zhang细化+灰度重心法
  10. 虚拟机ip映射到外网