Feign的工作原理[通俗易懂]

Feign的工作原理[通俗易懂]Feign的工作原理Feign是一个伪JavaHttp客户端,Feign不做任何的请求处理。Feign通过处理注解生成Request模板,从而简化了HttpAPI的开发。开发人员可以使用注解的方式定制RequestAPI模板。在发送HttpRequest请求之前,Feign通过处理注解的方式替换掉Request模板中的参数,生成真正的Request,并交给JavaHttp客户端去处理。利用这种方式,开发者只需要关注Feign注解模板的开发,而不用关注Http请求本身,简化了Http请求

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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做到了负载均衡。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186016.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Transfer: Javascript实现网页水印(非图片水印)

    Transfer: Javascript实现网页水印(非图片水印)

    2021年8月5日
    53
  • chmod命令详细用法

    chmod命令详细用法指令名称:chmod使用权限:所有使用者使用方式:chmod[-cfvR][–help][–version]modefile…说明:Linux/Unix的档案调用权限分为三级:档案拥有者

    2022年6月30日
    25
  • DB2数据库_db2查询所有表

    DB2数据库_db2查询所有表必需步骤:您已经启用了DB2扩展Windows安全性。您必须将运行DB2本地应用程序或工具的DB2用户添加至DB2ADMNS或DB2USER组可以使用端口号"50

    2022年8月2日
    10
  • 表单样式模板_商品表格模板

    表单样式模板_商品表格模板特殊项:用户中心左侧导航:frontend.base.php(增删导航可以在这里改  DW中大约561-760行)apply.index.html                                  申请开店页article.index.html                                 文章分类列表页(包括商城公告、商城公告及其他自建分

    2025年6月10日
    2
  • 【机器学习详解】SMO算法剖析「建议收藏」

    【机器学习详解】SMO算法剖析「建议收藏」本文力求简化SMO的算法思想,毕竟自己理解有限,无奈还是要拿一堆公式推来推去,但是静下心看完本篇并随手推导,你会迎刃而解的。推荐参看SMO原文中的伪代码。**1.SMO概念**===========上一篇博客已经详细介绍了[SVM原理](http://blog.csdn.net/luoshixian099/article/details/51073885),为了方便求解,把原始最优化问题转化成了其对偶问题,因

    2022年6月16日
    34
  • zigbee协议栈应用(二)基础协议栈入门

    zigbee协议栈应用(二)基础协议栈入门zigbee基础理论1.协议栈(1)协议栈定义协议栈是指网络中各层协议的总和,其形象的反映了一个网络中文件传输的过程: 由上层协议到底层协议,再由底层协议到上层协议。使用最广泛的是英特网协议栈,由上到下的协议分别是:应用层(HTTP,TELNET,DNS,EMAIL 等), 运输层(TCP,UDP),网络层(IP),链路层(WI-FI,以太网,令牌环,FDDI等),物理层。

    2022年5月28日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号