什么是Feign?

article/2025/9/2 13:31:10

服务间调用介绍

现有的服务调用方式

利用拼接的方式。
在这里插入图片描述
虽然上面有的用不错就很好了

在这里插入图片描述

Feign解决了什么问题

在这里插入图片描述

Feign的调用方式

在这里插入图片描述

Feign体系架构解析-武装到牙齿

上一节我们了解了feign的主要功能,它就像一个自拍杆一样,方便了Eureka的远程调用。可是怎么看都觉得Feign的功能很简单嘛,职责也比较单一,那它和Ribbon一样,都是大闲人了?
正所谓麻雀虽小五脏俱全,HTTP调用看着简单,实则下面隐藏的是一套非常复杂的流程。从上古时代jsp+servlet,到后面的SpringMVC,在HTTP请求解析和封装上同样是煞费苦心。

在这里插入图片描述
我们在学习中经常会碰到这种case,有些开源组件不显山来不露水,乍一看功能很简单,配置起来也不麻烦,让人感觉实现起来也不难。实际上我们所看到的只是冰山上的一角,在冰山下面隐藏的巨大基座才是这套技术的全貌。

Feign就是这样一位被武装到牙齿的特工,Feign的每个运作流程都包含了复杂的业务处理,Netflix对Feign更是关爱有加,甚至还给配备了两件重武器:Ribbon和Hystrix。由于Feign的调用链路比较长,所以我删减了很多支线剧情,只玩主线剧情,我们分为上下半场两张图给大家介绍Feign的架构全貌。
如果用一句话来介绍Feign,那就是:声明一个代理接口,服务调用者通过调用这个代理接口的方式来调用远程服务。这样一来,调用远程方法就如同调用本地接口一样方便。

上半场 - 构建请求

在这里插入图片描述
左右护法:大伙现在看出Feign是个什么腕儿了吗?看那身旁站着Ribbon和Hystrix,左青龙右白虎,给Feign保驾护航。没错,Feign自己兜里就揣着Ribbon和Hystrix两把重武器,引入Feign依赖的同时这两个组件也会被一同引入。Ribbon:利用负载均衡策略选定目标机器
Hystrix:根据熔断器的开启状态,决定是否发起此次调用
动态代理:Feign是通过一个代理接口进行远程调用,这一步就是为了构造接口的动态代理对象,用来代理远程服务的真实调用,这样你就可以像调用本地方法一样发起HTTP请求,不需要像Ribbon或者Eureka那样在方法调用的地方提供服务名。在Feign中动态代理是通过
Feign.build
返回的构造器来装配相关参数,然后调用ReflectFeign的newInstance方法创建的。这里就应用到了Builder设计模式,稍后番外篇会给大家说一个实现Builder模式的简单方法。
Contract:协议,顾名思义,就像HTTP协议,RPC协议一样,Feign也有自己的一套协议的规范,只不过他解析的不是HTTP请求,而是上一步提到的动态代理类。通过解析动态代理接口+Builder模式,Contract协议会构造复杂的元数据对象MethodMetadata,这里面包含了动态代理接口定义的所有特征。接下来,根据这些元数据生成一系列MethodHandler对象用来处理Request和Response请求。Contract具有高度可扩展性,可以经由对Contract的扩展,将Feign集成到其他开源组件之中。

关于Builder模式

Builder是设计模式中的一种,用来简化复杂组件的装配过程,假如用传统方式构建一个House类,那应该是这样写:

House house = ne House();
house.setWindow(“open”);
house.setDoor(“close”);

而Builder模式是用链式构造的方式创建复杂对象,比如这种形式

House.builder().window(“open”).door(“close”).build()

这里教大家一个简单的实现方式,那就是lombok小工具的@Builder注解,只要在pom中添加lombok依赖,并且在IDE中添加lombok的插件,就可以用注解的方法,不用写一行代码就能实现Builder模式。

发起调用

在这里插入图片描述

拦截器 :拦截器是Spring处理网络请求的经典方案,Feign这里也沿用了这个做法,通过一系列的拦截器对Request和Response对象进行装饰,比如通过RequestInterceptor给Request对象构造请求头。整装待发之后,就是正式发起调用的时候了。
发起请求:又到了左右护法的出场镜头了。这哼哈二将绝不放过开头和结尾两处重要镜头,正所谓从头到尾都参与了进来。重试:Feign这里借助Ribbon的配置重试器实现了重试操作,可以指定对当前服务节点发起重试,也可以让Feign换一个服务节点重试。
降级:Feign接口在声明时可以指定Hystrix的降级策略实现类,如果达到了Hystrix的超时判定,或得到了异常结果,将执行指定的降级逻辑。Hystrix降级熔断的内容,将在下一个大章节和大家见面。


http://chatgpt.dhexx.cn/article/Xw6V97NA.shtml

相关文章

Feign 的实现原理

Feign 实现原理 Feign是申明式的 HTTP 客户端。代码中创建一个接口并加上FeingClient 注解即可使用。其底层封装了 HTTP 客户端构建并发送的复杂逻辑。同时也可以整合注册中心及 Ribbon 为其提供负载均衡能力;通过整合 Histrix/sentinal 实现熔断限流功能。本期主要…

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

目录 问题现象: 问题分析: 拓展: 1、Feign: 2、OpenFeign: 问题现象: 最近在复习SpringCloud的时候看到一个面试题: OpenFeign的实现原理? 问题分析: OpenFeign是Sp…

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;因此会…