当前位置: 首页 > news >正文

OpenFeign的实现原理(附Feign和OpenFeign的区别)

目录

问题现象:

问题分析:

拓展:

1、Feign:

2、OpenFeign:


问题现象:

        最近在复习SpringCloud的时候看到一个面试题:

        OpenFeign的实现原理?


问题分析:

        OpenFeignSpring Cloud自己研发的,是对第一代SpringCloud(SpringCloud Netflix)Fegin组件的增强,支持Hystrix RibbonSpringMVC 注解。使得Feign 的使用更加方便。

        这里我就结合个人理解,大概的总结一下OpenFeign的实现原理:

  1. 在 Spring 项目启动阶段,启动类上的@EnableFeignClients注解,会引入一个FeignClientsRegistrar(Feign客户端注册类),它会从指定的目录下扫描并加载所有被 @FeignClient 注解修饰的接口类(interface),然后将这些接口类型注册成 Bean对象,统一交给 Spring 来管理。
  2. @FeignClient 修饰的接口类的方法,经过 MVC Contract 协议的解析后,放入 MethodMetadata(方法元数据)数组中。
  3. 然后创建一个动态代理对象Proxy ,指向了一个存放着key为@FeignClient 修饰的接口类的方法名,和 value为方法名对应的MethodHandler (MethodHandler 记录着MethodMetadata方法元数据的引用HashMap。然后把动态代理对象Proxy添加到 Spring 容器中,并注入到对应的服务里。
  4. 当服务调用FeignClient接口类的方法时,从动态代理对象 Proxy 中找到一个 MethodHandler 实例,生成一个包含该方法URL的 Http请求(不包含服务的 IP)。
  5. 经过Ribbon负载均衡算法找到一个服务的 IP 地址,拼接出完整的 URL,并发起请求。
  6. 被调用服务收到Http请求,就可以响应请求,返回数据给调用者了。

        借用知乎大佬文章中的一张网图:

        如果想要了解详细原理的伙伴,可以参考我在知乎上看到的一篇大佬写的文章,我觉得写得挺详细的:

        10000字 | 深入理解 OpenFeign 的架构原理 - 知乎


拓展:

        Feign和OpenFeign的区别?

1、Feign:

        FeignNetflix公司(第一代SpringCloud研发的一个轻量级RESTful的伪HTTP服务客户端。

        Feign内置了Ribbon逻辑,通过负载均衡算法可以从注册中心中寻找服务。

2、OpenFeign:

        OpenFeignSpringCloud自己研发的,在Feign的基础上做了增强。

        OpenFeign除了原有Ribbon逻辑外,还支持了HystrixSpring MVC注解

相关文章:

  • 不同性质生物素叠氮试剂Biotin-azide,Biotin-PEG2/PEG3/PEG4-azide特点分享
  • 【Linux】信号
  • 网络协议:透彻解析HTTPS协议
  • 编译 mesa
  • 健身房信息管理系统(PHP+Html+MySQL)
  • 什么是蜂窝移动网络?
  • 全志V853 NPU 系统介绍
  • Jupyter Notebook 换个主题清爽了很多
  • 【C++】红黑树
  • 提升C内功--函数栈帧的创建和销毁(动画讲解)
  • Buffer Pool Size of Total RAM No data
  • Python添加水印简简单单,三行代码教你批量添加
  • 微服务中间件
  • C语言学习-数组应用-三子棋(4.1)
  • java编程思想
  • 分享一款快速APP功能测试工具
  • (三)从jvm层面了解线程的启动和停止
  • C++入门教程(10):for 语句
  • canvas 五子棋游戏
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java 最常见的 200+ 面试题:面试必备
  • Java教程_软件开发基础
  • php面试题 汇集2
  • Redux 中间件分析
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 分布式熔断降级平台aegis
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 利用DataURL技术在网页上显示图片
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 模型微调
  • 如何用vue打造一个移动端音乐播放器
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 树莓派 - 使用须知
  • 1.Ext JS 建立web开发工程
  • 说说我为什么看好Spring Cloud Alibaba
  • #14vue3生成表单并跳转到外部地址的方式
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (1)(1.13) SiK无线电高级配置(五)
  • (分布式缓存)Redis分片集群
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三) diretfbrc详解
  • (十一)c52学习之旅-动态数码管
  • (四)Linux Shell编程——输入输出重定向
  • (转)Sublime Text3配置Lua运行环境
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • ***监测系统的构建(chkrootkit )
  • ***通过什么方式***网吧
  • *p++,*(p++),*++p,(*p)++区别?
  • .mysql secret在哪_MySQL如何使用索引
  • [<死锁专题>]