[SpringCloud] OpenFeign核心架构原理 (一)

Feign的本质: 动态代理 + 七大核心组件

Feign底层是基于JDK动态代理来的, Feign.builder()最终构造的是一个代理对象, Feign在构建对象的时候会解析方法上的注解和参数, 获取Http请求需要用到基本参数以及和这些参数和方法参数的对应关系。然后发送Http请求, 获取响应, 再根据响应的内容的类型将响应体的内容转换成对应的类型。

#feign.Feign.Builder:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这些核心组件可以通过Feign.builder()进行替换。

  1. Contract
  2. Encoder
  3. Decoder
  4. Client
  5. InvocationHandlerFactory
  6. RequestInterceptor
  7. Retryer

文章目录

      • 1.Contract
      • 2.Encoder
      • 3.Decoder
      • 4.Client
      • 5.InvocationHandlerFactory
      • 6.RequestInterceptor
      • 7.Retryer
      • 8.总结

1.Contract

在这里插入图片描述

解析方法上的注解和参数, 获取Http请求需要用到基本参数。

Contract的默认实现是解析Feign自己原生注解的。

在这里插入图片描述

会为每个方法生成一个MethodMetadata对象。

在这里插入图片描述

MethodMetadata就封装了Http请求需要用到基本参数以及这些参数和方法参数的对应关系。

SpringCloud在整合Feign的时候, 为了让Feign能够识别Spring MVC的注解, 所以就自己实现了Contract接口。

在这里插入图片描述

在这里插入图片描述

2.Encoder

作用就是将请求体对应的方法参数序列化成字节数组。

在这里插入图片描述

在这里插入图片描述

Feign默认的Encoder实现只支持请求体对应的方法参数类型为String和字节数组。

在这里插入图片描述

如果是其他类型的话, 无法对对象进行序列化, 所以Spring就实现了Encoder接口。

在这里插入图片描述

在这里插入图片描述

可以将任意请求体对应的方法参数类型对象序列化成字节数组。

3.Decoder

Decoder其实就是将响应体由字节流反序列化成方法返回值类型的对象。

在这里插入图片描述

在这里插入图片描述

Spring也同样实现了Decoder。

在这里插入图片描述

在这里插入图片描述

可以将响应体对应的字节流反序列化成任意返回值类型对象。

4.Client

动态代理对象最终用来执行Http请求的组件。

在这里插入图片描述

默认实现为JDK的HttpURLConnection。

在这里插入图片描述

Feign还提供了基于HttpClient实现。

在这里插入图片描述

开启ApacheHttpClient发连接。

        <dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.3</version></dependency><!-- feign-hc5--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-hc5</artifactId><version>13.1</version></dependency>

在这里插入图片描述

基于负载均衡的实现:

在这里插入图片描述

根据服务名, 从ibbon中获取一个服务实例的信息, ip和端口号。之后会通过ip和端口向服务实例发送Http请求。

5.InvocationHandlerFactory

InvocationHandler的invoke方法实现就是动态代理走的核心逻辑, 而InvocationHandlerFactory其实就是创建InvocationHandler的工厂。

在这里插入图片描述

在这里插入图片描述

默认实现:

在这里插入图片描述

InvocationHandler的实现类FeignInvocationHandler。

在这里插入图片描述

最终会调用方法对应的MethodHandler的invoke方法。

在这里插入图片描述

Sentinel都实现了自己的InvocationHandler。

在这里插入图片描述

6.RequestInterceptor

在这里插入图片描述

是一个在发送请求前的一个拦截接口, 可以在发送Http请求之前再对Http请求的内容进行修改。如我们可以设置一些接口需要的公共参数, 授权token等。

@Component
public class TokenRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {template.header("token", "token值");}}

7.Retryer

在这里插入图片描述

是一个重试的组件。默认实现:

在这里插入图片描述

默认的重试机制次数为5次。

SpringCloud的默认实现是:

在这里插入图片描述

所以SpringCloud下默认是不会进行重试。

8.总结

在这里插入图片描述

还有一些组件: 日志级别Logger.Level, 日志输出Logger。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/721998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Web开发记录 Day6:MySQL(关系型数据库)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 六、MySQL1、MySQL-概述和引入①MySQL是什么&am…

liunx安装jdk、redis、nginx

jdk安装 下载jdk,解压。 sudo tar -zxvf /usr/local/jdk-8u321-linux-x64.tar.gz -C /usr/local/ 在/etc/profile文件中的&#xff0c;我们只需要编辑一下&#xff0c;在文件的最后加上java变量的有关配置&#xff08;其他内容不要动&#xff09;。 export JAVA_HOME/usr/l…

docker部署aria2-pro

前言 我平时有一些下载视频和一些资源文件的需求&#xff0c;有时候需要离线下载&#xff0c;也要速度比较快的方式 之前我是用家里的玩客云绝育之后不再写盘当下载机用的&#xff0c;但是限制很多 我发现了aria2 这个下载器非常适合我&#xff0c;而有个大佬又在原来的基础…

10 OpenCV 形态学的应用

文章目录 算子形态学提取直线示例 算子 adaptiveThreshold 二值化算子 adaptiveThreshold(src, dstNone,maxValue, adaptiveMethod, thresholdType, blockSize, C, ) /* *src&#xff1a;灰度化的图片 *dst&#xff1a;输出图像&#xff0c;可选 *maxValue&#xff1a;满足条件…

C#中对象的相等性与同一性的判断方法总结

C#对象的相等性与同一性 1. 概述与准备1.1 概述1.2 准备 2. Equals(Object)2.1 功能&#xff1a;2.2 实例&#xff1a;2.3 扩展&#xff1a;2.4 重写此方法 3. Equals(Object, Object)3.1 功能3.2 实例 4. ReferenceEquals(Object, Object)4.1 功能4.2 使用场景&#xff1a;4.3…

数据结构学习(四)高级数据结构

高级数据结构 1. 概念 之所以称它们为高级的数据结构&#xff0c;是因为它们的实现要比那些常用的数据结构要复杂很多&#xff0c;能够让我们在处理复杂问题的过程中&#xff0c; 多拥有一把利器&#xff0c;同时掌握好它们的性质&#xff0c;以及所适应的场合&#xff0c;在…

《剑指offer》76--删除链表中重复的结点[C++]

目录 题目&#xff1a; 思路&#xff1a; 贴代码&#xff1a; 代码输出 题目&#xff1a; 在一个排序的链表中&#xff0c;存在重复的结点&#xff0c;请删除该链表中重复的结点&#xff0c;重复的结点不保留&#xff0c;最后返回链表头指针。 如&#xff1a; 链表1->…

PaddleOCR基于PPOCRv4的垂类场景模型微调——手写文字识别

PaddleOCR手写文字识别 一. 项目背景二. 环境配置三. 数据构造四. 模型微调五. 串联推理六. 注意事项七. 参考文献 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;ORC是指对包含文本资料的图像文件进行分析识别处理&#xff0c;获取文字…

EXTJS实现自定义表格

宽度自适应 width: 100%, 高度自适应 height: 100% 同时设置表格所处页面高度100% html,body,#griddemo{height: 100%;} 自定义显示的文本内容 Ext.onReady(function () {Ext.QuickTips.init()function sexText(val) {if (val 0) {return <span style"color:green…

网络编程的学习

思维导图 多路复用代码练习 select完成TCP并发服务器 #include<myhead.h> #define SER_IP "192.168.125.73" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv[]) {//1、创建用于监听的套接字int sfd -1;s…

QPainter::translate: Painter not active

画笔关联画布 就是这里少写了this指针

05_Mongooes

Mongooes Mongoose是通过Node来操作MongoDB的一个模块。是基于Node.js的第三方模块。 一、Node.js安装 1.解压 2.创建文件夹 解压路径下&#xff0c;创建两个文件夹 node_global&#xff1a;全局安装位置 node_cache&#xff1a;缓存 3.配置 配置环境变量 在path路径…

毫秒生成的时间戳如何转化成东八区具体时间

假设现在有一个时间是1709101071419L 后端代码实现 Java代码&#xff08;东八区时间&#xff09; 在Java代码中&#xff0c;我们将时区从UTC调整为东八区&#xff08;UTC8&#xff09;&#xff1a; import java.time.Instant; import java.time.ZoneId; import java.time.Z…

FreeRTOS操作系统学习——FreeRTOS工程介绍

FreeRTOS工程介绍 核心文件 FreeRTOS的最核心文件只有2个&#xff1a; FreeRTOS/Source/tasks.cFreeRTOS/Source/list.c 文件功能如下图&#xff1a; 头文件相关 内存管理文件 文件在 Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang 下&#xff0c;它也是放…

JavaScript的`call`方法:实现函数间的调用!

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

堆和二叉树的动态实现(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

BUUCTF-Misc-[SUCTF 2019]Game1

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 下载附件一大堆文件&#xff0c;打开index.html时发现一大串base字符 U2FsdGVkX1zHjSBeYPtWQVSwXzcVFZLu6Qm0To/KeuHg8vKAxFrVQ 写代码和工具解都可以 填进去后错误&#xff0c;发现不是真的flag 查看另外一张照片&#xff0c;…

图像AI换脸软件:AI FaceSwap 中文版

AI FaceSwap 是一款利用人工智能技术进行面部交换的软件。该软件通过先进的人工智能算法&#xff0c;能够将一个人的面部表情、神态和特征准确地映射到另一个人身上&#xff0c;实现面部交换的效果。用户只需要提供两张照片&#xff0c;一张是目标人物的照片&#xff0c;另一张…

数据库进阶——如何提升数据库的安全性,以MySQL和Redis加固为例

目录 引出数据库加固加固思路MySQLRedis Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 数据库进阶——如何提升数据库的安全性&#xff0c;以MySQL和Redis加固为例 数据库加固 加固思路 账号配置 应按照用户分配账号&…

Nginx使用—基础知识

Nginx简介 Nginx优点 高性能、高并发 支持很高的并发&#xff0c;在处理大量并发的情况下&#xff0c;比其他web服务器要高效 轻量且高扩展 功能模块少(源代码仅保留http与核心模块代码&#xff0c;其余不够核心代码会作为插件来安装) 代码模块化&#xff08;易读&#xff0…