Feign的工作原理
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 的源码实现过程如下。
- 首先通过@EnableFeignClients注解开启FeignClient 的功能。只有这个注解存在,才会在程序启动时开启对@FeignClient注解的包扫描。
- 根据Feign的规则实现接口,并在接口上面加上@FeignClient注解。
- 程序启动后,会进行包扫描,扫描所有的@ FeignClient 的注解的类,并将这些信息注入IoC容器中。
- 当接口的方法被调用时,通过JDK的代理来生成具体的RequestTemplate模板对象。
- 根据RequestTemplate再生成Http请求的Request对象。
- Request 对象交给Client去处理,其中Client的网络请求框架可以是HtpURLConnection、HttpClient和OkHttp。
- 最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。
Feign的工作原理相关推荐
- SpringCloud Feign工作原理基本理解
Feign介绍 Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端.Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均 ...
- Spring Cloud Hystrix 源码系列:工作原理
Hystrix 译为 "豪猪",豪猪的棘刺能保护自己不受天敌伤害,代表了强大的防御能力.Hystrix 基于 RxJava 进行实现,RxJava 是一种基于观察者模式的响应式编程 ...
- 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...
- 深入理解Nginx工作原理
1 反向代理 1.1 概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给intern ...
- 高频开关电源原理_程控开关电源的工作原理
本文介绍了开关电源的工作原理以及它的特点. 程控开关电源要要比线性电源复杂得多. 下图是典型的开关电源工作原理图. 首先对 220 V/50Hz 的 AC 输入,通过桥式整流器进行整流 储能电容对整流 ...
- Servlet生命周期与工作原理
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
- java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?
近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...
- linux网络管理原理,Linux__网络管理(物理层 数据链路层 网络层工作原理)
千锋云计算逆战班11点后打卡 今天学习后,进行复习下,物理层 数据链路层 网络层 的工作原理 物理层关心的两件事情:1.信号 2.介质 先说信号:信号分为模拟信号和数字信号 模拟信号: 模拟信号,不 ...
- HDD工作原理 导图
以上导图介绍了我们使用的 (HDD)机械硬盘的基本构造以及核心工作原理,对于大家扫盲有所帮助 参考文档: https://blog.csdn.net/yizhaoxin/article/details ...
- 路由和交换机工作原理
路由器与交换机的工作原理 计算机网络往往由许多种不同类型的网络互连连接而成.如果几个计算机网络只是在物理上连接在一起,它们之间并不能进行通信,那么这种"互连"并没有什么实际意义.因 ...
最新文章
- leetcode前缀树java_LeetCode 实现 Trie (前缀树)
- FPGA设计中MEMORY型数据怎么综合到blockRAM里面(二)
- 心得体悟帖---12、志向还是太短浅,目光也是
- [译] 如何使用纯函数式 JavaScript 处理脏副作用
- 从几何与代数的角度推算坐标旋转变换矩阵(以2维为例)
- 【论文解读】KDD20 | 图神经网络在生物医药领域的应用
- JavaUtils - 文件操作
- 【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)
- spring整合ehcache2.5.2缓存异常-- net.sf.ehcache.CacheException
- ubuntun 16.04 AttributeError: type object 'Callable' has no attribute '_abc_registry'
- Linux命令——cut命令学习
- gettid()和pthread_self()的区别
- Lock(ReentrantLock)实现线程同步,线程安全
- 【Oracle】Rman备份策略
- numpy array
- 4米乘以12米CAD图_实例讲解CAD制图比例
- Windows命令行工具cmder配置
- libtorrent安装windows版
- 网易暴力裁员事件 网易员工疑遭网易暴力裁员
- Win7下装centos7
热门文章
- java基于springboot+vue的学生宿舍报修管理系统(源码+数据库+Lw文档)
- cad.net 更改高版本填充交互方式为低版本样子
- mybatisplus修改某个字段_mybatisplus 怎么修改数据
- 解决MySQL登录1045错误
- php获取当前页面链接_php怎么获取当前完整url地址
- cad批量选择相同块_怎样在cad中快速选定同一个块的所有对象?
- mysql proxy maxscale_maxscale参数配置
- 【小白】线性表的链式存储结构的实现(C语言版)
- 激光条纹中心提取——zhang细化+灰度重心法
- 虚拟机ip映射到外网