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

article/2025/9/2 13:32:26

目录

问题现象:

问题分析:

拓展:

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注解


http://chatgpt.dhexx.cn/article/8C62mwhh.shtml

相关文章

Feign原理

是一个HTTP请求调用轻量级框架,可以以Java接口注解的方式调用HTTP请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。 Feign解决了什么问题 在服务调用的场景中,我们经常调用基于HTTP协议的服务,而我们经常使用到的框架可…

Feign的使用及原理剖析

feign使用及原理剖析 一、简介 Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求。Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转…

Feign基本使用(超详细)

目录 一、Feign概述 二、Feign入门 1.创建服务提供者(provider) 2.创建feign接口 3、创建服务消费者(consumer) 三、Feign 原理 四、Feign优化 1、开启feign日志 2、feign超时问题 3、http连接池 4、gzip压缩 前言 当我们通过RestTemplate调用其它服务的API时,所…

简单理解Feign的原理与使用

文章目录 SpringCloud 总架构图一、简介1.1、负载均衡的概念2.2、Feign概念 二、入门案例2.1、导入依赖2.2、Feign的客户端2.3、调用Feign2.4、开启Feign功能2.5、启动测试2.6、Feign实现原理简单分析 三、负载均衡(Ribbon)四、熔断器支持五、请求压缩和响应压缩六、配置日志级…

【第四章】详解Feign的实现原理

1.1 Feign概述 这篇文章主要讲述如何通过Feign去消费服务,以及Feign的实现原理的解析。 Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可以帮助我们更快捷、优雅地调用HTTP API。 Feign是⼀个HTTP请求的轻量级客户端框架。通过 接口 注解的…

Feign底层原理分析-自动装载动态代理

本篇文章仅介绍Feign的核心机制,包括如何交由Spring容器托管、动态代理机制等内容,不会过分深入细节。 1、什么是Feign? 这里套用Feign官方Github上的介绍:“Feign是一个灵感来自于Retrofit、JAXRS-2.0、WebSocket的Java Http客户…

Feign原理 (图解)

1.1 简介:Feign远程调用的 Feign远程调用,核心就是通过一系列的封装和处理,将以JAVA注解的方式定义的远程调用API接口,最终转换成HTTP的请求形式,然后将HTTP的请求的响应结果,解码成JAVA Bean,放…

Feign的工作原理

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

Linux命令——tar与gzip详解:文件的打包压缩与解压缩解打包

Linux系统中,最常用的打包命令就是tar了,不仅如此,tar命令还可以解打包解压缩,十分方便。如果单纯想压缩文件,就需要我们的gzip命令了。 使用tar打包归档的包叫做tar包,以.tar结尾 使用gzip压缩的文件&…

Linux 下使用 tar 命令打包指定目录下的所有文件,不包括目录

一,问题描述 无论是 Linux 系统,还是 macOS 系统,我们都可以使用 tar 命令进行文件的压缩打包。命令格式如下: # tar cvf xxxx.tar 要压缩的文件或目录名称但如果要压缩的目录层级比较多时,比如: # tar cvf…

linux tar (打包、压缩、解压)命令

打包程序:tar c: 创建文档t: 列出存档内容x:提取存档f: filename 要操作的文档名v:详细信息 一:打包 打包:是指把文件整合在一起,不压缩 1.将文件打包:tar cf a.ta…

(21)tar打包命令详解

Linux 系统中,最常用的归档(打包)命令就是 tar,该命令可以将许多文件一起保存到一个单独的磁盘中进行归档。不仅如此,该命令还可以从归档文件中还原所需文件,也就是打包的反过程,称为解打包。1.tar命令做打包操作  当 tar 命令用于打包操作时,该命令的基本格式为: …

vector中删除某个指定元素

class Solution { public:int removeElement(vector<int>& v, int val) {for (auto it v.begin(); it ! v.end(); it) {if (*it val) { // 条件语句v.erase(it); // 移除他it--; // 让该迭代器指向前一个}}return v.size();} };

vector删除指定元素

C vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法。 C 中std::remove()并不删除元素&#xff0c;因为容器的size()没有变化&#xff0c;只是元素的替换。 1.std::vector::erase() 函数原型&#xff1a;iterator erase (iterator position);  //删除指定…

C++中vector中删除/添加指定位置处的元素

1、函数介绍 C中vector容器可以删除/添加制定位置处的元素&#xff0c;分别使用erase()与insert()函数。其中函数内需要两个参数&#xff0c;第一个为指定删除/添加的位置&#xff0c;第二个元素为删除/添加的元素值。 iterator insert(const_iterator _Where, _Ty&&…

C/C++ vector 删除指定元素

C vector 删除符合条件的元素C vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法。C 中std::remove()并不删除元素&#xff0c;因为容器的size()没有变化&#xff0c;只是元素的替换。1.std::vector::erase()  函数原型&#xff1a;iterator erase (iterat…

【c++】vector中删除元素

目录 1.删除指定范围的元素2.删除指定大小的元素3.C20 std::erase, std::erase_if (std::vector)注意点 1.删除指定范围的元素 vector删除元素之pop_back(),erase(),remove() 向量容器vector的成员函数pop_back()可以删除最后一个元素. 而函数erase()可以删除由一个iterator指…

光纤光学原理相关基础知识点

记&#xff1a;研究生导师的方向是光纤光学和机器学习交叉的&#xff0c;导师给推荐了本书&#xff0c;书里面的理论和推导公式作为小白的我真的是不太行&#xff0c;后来在中国大学mooc上找了视频课跟着学习&#xff0c;顺便做下笔记&#xff0c;为日后使用&#xff0c;因此会…

机器人学重点知识点总结

机器人学重点知识点总结 坐标转换与机械臂运动学雅克比矩阵机械臂逆向动力学&#xff08;牛顿欧拉递推&#xff09;机械臂正向动力学运动轨迹生成动力学轨迹跟踪控制 这篇博客主要用来记录一下现代机器人学里面比较基础也比较重要的一些知识点&#xff0c;所有内容均仅仅记录是…

大学物理(下)知识点总结

大学物理&#xff08;下&#xff09;知识点总结&#xff08;持续更新&#xff09; 文章目录 大学物理&#xff08;下&#xff09;知识点总结&#xff08;持续更新&#xff09;静电场知识点总结习题精选 磁场知识点总结习题精选 期中复习总结电磁场知识点总结习题精选 狭义相对论…