[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 {

    @Override
    public void apply(RequestTemplate template) {
        template.header("token", "token值");
    }

}

7.Retryer

在这里插入图片描述

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

在这里插入图片描述

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

SpringCloud的默认实现是:

在这里插入图片描述

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

8.总结

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024-3-4 市场分歧视角

今天市场有一个单独分歧视角可以观察思考&#xff0c;竞价氢能这边严重不符合预期&#xff0c;隔夜单 四川金顶 和 东方精工 大幅减少&#xff0c;预期就是这两个货会高位分歧&#xff0c;最高板 东方精工 开盘就是瀑布杀&#xff0c;四川金顶先杀到1个多点&#xff0c;9&#…

分库分表如何管理不同实例中几万张分片表?

在进行分库分表设计时&#xff0c;确认好了数据节点数量和分片策略以后&#xff0c;接下来要做的就是管理大量的分片表。实际实施过程中可能存在上百个分片数据库实例&#xff0c;每个实例中都可能有成千上万个分片表&#xff0c;如果仅依靠人力来完成这些任务显然是不现实的。…

【AI视野·今日Robot 机器人论文速览 第八十期】Fri, 1 Mar 2024

AI视野今日CS.Robotics 机器人学论文速览 Fri, 1 Mar 2024 Totally 32 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Humanoid Locomotion as Next Token Prediction Authors Ilija Radosavovic, Bike Zhang, Baifeng Shi, Jathushan Rajasegaran…

Linux--文件(2)-重定向和文件缓冲

命令行中的重定向符号 介绍和使用 在Linux的命令行中&#xff0c;重定向符号用于将命令的输入或输出重定向到文件或设备。 常见的重定向符号&#xff1a; 1.“>“符号&#xff1a;将命令的标准输出重定向到指定文件中&#xff0c;并覆盖原有的内容。 2.”>>“符号&a…

《高效使用Redis》- 由面试题“Redis是否为单线程”引发的思考

由面试题“Redis是否为单线程”引发的思考 很多人都遇到过这么一道面试题&#xff1a;Redis是单线程还是多线程&#xff1f;这个问题既简单又复杂。说他简单是因为大多数人都知道Redis是单线程&#xff0c;说复杂是因为这个答案其实并不准确。 难道Redis不是单线程&#xff1f…

springboot项目单纯使用nacos注册中心功能

Spring Boot 项目完全可以单独使用 Nacos 作为注册中心。Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它支持服务的注册与发现&#xff0c;能够与 Spring Boot 应用无缝集成&#xff0c;为微服务架构提供了强大的支持。 在使用 Nacos 作为注册中…

#QT(串口助手-界面)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;编写串口助手 3.记录 接收框:Plain Text Edit 属性选择&#xff1a;Combo Box 发送框:Line Edit 广告&#xff1a;Group Box &#xff08;1&#xff09;仿照现有串口助手设计UI界面 &#xff08;2&#xff09;此时串口助手大…

从0搭建Azure DevOps Server

Windows虚拟机搭建DevOps 服务器 背景资源准备安装软件需求流程版本兼容性安装SQL ServerSSMS安装visual StudioAzure DevOps Server测试本地访问端口更改及外界访问 背景 搭建一台Azure DevOps Server 供我们运维项目开发&#xff0c;现在DevOps运维已成为一个主流&#xff0…

【金三银四】每日一点面试题(Java--JVM篇)

1、说一下 JVM 的主要组成部分及其作用&#xff1f; JVM&#xff08;Java虚拟机&#xff09;是Java程序运行的核心组件&#xff0c;它负责将Java字节码翻译成底层操作系统能够执行的指令。JVM由以下几个主要组成部分构成&#xff1a; 类加载器&#xff08;Class Loader&#…

117.移除链表元素(力扣)

题目描述 代码解决 class Solution { public:ListNode* removeElements(ListNode* head, int val) {//删除头节点while(head!NULL&&head->valval){ListNode*tmphead;headhead->next;delete tmp;}//删除非头节点ListNode*curhead;while(cur!NULL&&cur-&g…

【python】python用户管理系统[简易版](源码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

End-to-End Weakly-Supervised SemanticSegmentation with Transformers

摘要 弱监督语义分割&#xff08;WSSS&#xff09;使用图像级标签是一项重要且具有挑战性的任务。由于高训练效率&#xff0c;端到端的WSSS解决方案受到社区越来越多的关注。然而&#xff0c;当前的方法主要基于卷积神经网络&#xff0c;并未正确地探索全局信息&#xff0c;因…

SwiftUI 在 App 中弹出全局消息横幅(下)

功能需求 在 SwiftUI 开发的 App 界面中,有时我们需要在全局层面向用户展示一些消息: 如上图所示:我们弹出的全局消息横幅位于所有视图之上,这意味这它不会被任何东西所遮挡;而且用户可以点击该横幅关闭它。这是怎么做到的呢? 在本篇博文中,您将学到以下内容 功能需求…

靶机渗透之Misdirection

Name: Misdirection: 1Date release: 24 Sep 2019Author: FalconSpySeries: MisdirectionDownload (Mirror): https://download.vulnhub.com/misdirection/Misdirection.zip 对于vulnhub中的靶机&#xff0c;我们都需先下载镜像&#xff0c;然后导入VM&#xff0c;并将网络连接…

简要讲解OV7725摄像头

本文主要包含以下几部分内容&#xff1a; 1. 通过OV7725分析模块原理图。 2. 讲解部分寄存器的含义、RGB565格式图像输出时序、帧率计算。 3. 讲解SCCB协议与I2C协议的区别。 1、OV7725功能 OV7725是一款1/4英寸单芯片图像传感器&#xff0c;其感光阵列达到640*480&#xff0c…

【Python】Python教师/学生信息管理系统 [简易版] (源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

抓 https 报文新方案 -Magisk+LSPosed,来试试吧

【面试突击班】1. 性能测试主要关注哪些指标&#xff1f; 关于如何抓取Android端https报文&#xff0c;在之前一篇文章中有介绍可以通过VitualXposedJustTrustMe模块禁用SSL验证&#xff0c;这样可以抓取到https&#xff0c;还是有一些同学反馈以下的一些问题&#xff1a; App…

2023年12月CCF-GESP编程能力等级认证Scratch图形化编程三级真题解析

本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(共15题,共30分) 第1题 现代计算机是指电子计算机,它所基于的是( )体系结构。 A:艾伦图灵 B:冯诺依曼 C:阿塔纳索夫 D:埃克特-莫克利 答案:B 第2题 默认小猫角色,执行下列程…

React-子传父

1.概念 说明&#xff1a;React中子组件向父组件传递数据通常涉及回调函数和状态提升等方法。 2.代码实现 2.1绑定事件 说明&#xff1a;父组件绑定自定义事件 <Son onGetSonMsg{getMsg}></Son> 2.2接受事件 说明&#xff1a;子组件接受父组件的自定义事件名称…

day46_Servlet

今日内容 0 复习昨日 1 Servlet基础 1.1 Servlet介绍 1.2 第一个Servlet 1.3 流程分析 1.4 使用细节 1.5 映射细节 1.6 生命周期 2 HttpServlet 2.1 HTTP请求、响应、状态码 2.2 GET和POST的区别 2.3 HttpServlet 0 复习昨日 1 maven创建-java项目结构 2 maven创建-javaweb项目…