OpenFeign原理浅析

news2024/11/15 8:48:46

OpenFeign原理我个人觉得是非常简单的,如果你对Spring非常了解,知道FactoryBean,以及注入bean的方式,并掌握动态代理,那么自己实现一个类似这样的Http代理客户端是一点问题也没有的!

使用流程

首先我们先过一边常规的使用流程:

1.启动类打上@EnableFeignClients注解

2.然后在调用接口上打上@FeignClient注解,接口方法就是常规Post、Get注解

3.之后在代码中依赖注入这个接口就可以像调用普通方法一样实现Http调用了

思考两个问题,一个接口没有任何实现类能发起调用吗?接口类是怎么被扫描进Bean容器中的?

原理流程

@FeignClient注解

首先我们看是怎么注入容器的,先看看@FeignClient注解,就是一个平平无奇的注解,显然是不会被Spring的扫描机制自动扫描的处理的,那么答案就应该 在@EnableFeignClients注解上了

在这里插入图片描述

@EnableFeignClients注解

该注解内有一个@Import注解,显然这就是我们要的,有一个FeignClientsRegistrar类,名称就看得出来是FeignClient的注册类

如果对Spring注入方式不了解的话,看看我之前写的:Bean放入容器的几种方式

在这里插入图片描述

FeignClientsRegistrar

他实现了ImportBeanDefinitionRegistrar接口,该接口是往Spring注册BeanDefinition的,所以我们直接去看看他实现的registerBeanDefinitions方法中注册了什么BeanDefinition

BeanDefinition是Bean的定义,在Spring的Bean生成流程中是先有BeanDefinition后有Bean,所以BeanDefinition基本可以认为是一个即将要被注入的Bean

在这里插入图片描述

registerBeanDefinitions方法:

在这里插入图片描述

扫描后遍历去注册

在这里插入图片描述

registerFeignClient方法:

这里就非常的明显了,最后注入了个啥?FeignClientFactoryBean!!,所以最终我们在依赖注入的时候实际上获取的是FactoryBean.getObject所产生的对象!到了这Spring的工作就已经结束了

如果对FactoryBean不了解的,建议先去了解一下

在这里插入图片描述

FeignClientFactoryBean

这里的后续流程其实就和Spring没啥关系了,后面就是代理类的生成过程,如果想了解feign是怎么和Ribbon、Hystrix打通的倒是可以继续往下专,这里就不再带着大家往下看了(最后给了个流程图可以自己看,最后发起调用的是RequestTemplate

在这里插入图片描述

不过值得一提的是Feign默认是有一个重试机制的,用的是Retry,默认是关闭,当然也可以自定义重试机制,这里可能很多人都会忽略,这段代码在(SynchronousMethodHandler

在这里插入图片描述

总流程图

在这里插入图片描述

配置项
在这里插入图片描述

总结

所以现在懂了吗?

  1. 通过@EnableFeignCleints触发Spring应用程序对classpath中@FeignClient修饰类的扫猫
  2. 解析到@FeignClient修饰类后,Feign框架通过扩展Spring Bean Deifinition的注册逻辑,最终注册一个FeignClientFacotoryBean进入Spring容器
  3. Spring容器在初始化其他用到@FeignClient接口的类时,获得的是FeignClientFacotryBean产生的一个代理对像Proxy.
  4. 基于java原生的动态代理机制,针对Proxy的调用,都会被统转发给Feign框架所定义的一个InvocationHandler,由该Handler完成后续的HTTP转换,发送,接收,翻译HTTP响应的工作

个人博客

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

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

相关文章

BLE连接、配对和绑定

参考:一篇文章带你解读蓝牙配对绑定 参考:BLE安全之SM剖析(1) 参考:BLE安全之SM剖析(2) 参考:BLE安全之SM剖析(3) 参考:https://blog.csdn.net/chengbaojin/article/details/103691046 参考&…

【MQTT5】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务

文章目录 视频演示效果前言一、分析二、全局注入MQTT连接1.引入库2.写入全局连接代码 二、PHP环境建立总结 视频演示效果 【uniapp】实现买定离手小游戏 前言 Mqtt不同环境问题太多,新手可以看下 《【MQTT】Esp32数据上传采集:最新mqtt插件(支…

Flowable-服务-骆驼任务

目录 定义图形标记XML内容Flowable与Camel集成使用示例设计Came路由代码 定义 Camel 任务不是 BPMN 2.0 规范定义的官方任务,在 Flowable 中,Camel 任务是作为一种特殊的服务 任务来实现的。主要做路由工作的。 图形标记 由于 Camel 任务不是 BPMN 2.…

BMI指数计算小工具Java

现在越来越多的人关注健康,关注身材管理,不妨做个小工具,计算自己的BMI,给自己制定合理的健身或减肥计划,享受健康生活!!!BMI的计算标准从网上找的,不知道是否准确&#…

❤ yarn 和npm 的使用

❤ yarn 和npm 的使用 yarn 版本1的使用 yarn 简介 Yarn是facebook发布的一款取代npm的包管理工具。 yarn特点: 1,速度超快。 Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因…

TransGPT 开源交通大模型开源

TransGPT 是开源交通大模型,主要致力于在真实交通行业中发挥实际价值。 它能够实现交通情况预测、智能咨询助手、公共交通服务、交通规划设计、交通安全教育、协助管理、交通事故报告和分析、自动驾驶辅助系统等功能。 TransGPT 作为一个通用常识交通大模型&#…

cmd相关操作命令

1.根据端口号查询对应进程的PID netstat -ano | findstr 端口号 例如:netstat -ano | findstr 9080;该端口所属进程的PID为6684 2.根据PID查询对应进程 tasklist | findstr PID 例如:tasklist | findstr 6684;该PID所属进程名为…

啥都收费,不仅智能电视没人买了,连电视盒子也卖不出了

分析机构给出的数据指今年上半年国内的电视盒子销量跌破百万至92.9万台,同比下滑29%,享受额更是大跌32%,显示出电视盒子即使大幅降价也没人买了,导致消费者远离电视在于收费太离谱了。 一、啥都收费 如今的智能电视其实并不智能&a…

使用贝叶斯滤波器通过运动模型和嘈杂的墙壁传感器定位机器人研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Day48 算法记录|动态规划15 (子序列)

子序列 392. 判断子序列115.不同的子序列 392. 判断子序列 这道题和1143最长公共字串相同 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。 class Solution {public boolean isSubsequence(String s,…

【C语言初阶篇】自定义类型结构体我不允许还有人不会!

🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 📋 前言1 . 什么是结构体1.1 结构的定义1.2 结构的声明 2.结构体初始化2.1 用标签名定义和初始化2.2…

【Vue】Vue-Cli整合Echart

Vue-Cli整合Echart 文章目录 Vue-Cli整合Echart一、创建Vue-Cli项目1、创建并运行Vue Cli hello-world项目2、运行vue-element-admin项目 二、Vue-Cli整合Echart1、使用echarts CDN源实现K线图绘制2、使用VueCli echarts实现K线图绘制3、echart更多使用问题整理 一、创建Vue-C…

LeetCode222. 完全二叉树的节点个数

222. 完全二叉树的节点个数 文章目录 [222. 完全二叉树的节点个数](https://leetcode.cn/problems/count-complete-tree-nodes/)一、题目二、题解方法一:递归遍历所有结点方法二:根据完全二叉树的特性递归方法三:迭代 一、题目 给你一棵 完全…

[C语言] 数组

1. 一维数组的创建和初始化 2. 一维数组的使用 3. 一维数组在内存中的存储 4. 二维数组的创建和初始化 5. 二维数组的使用 6. 二维数组在内存中的存储 7. 数组越界 8. 数组作为函数参数 9. 数组的应用实例 1 :三子棋 10. 数组的应用实例 2 &#…

初阶数据结构——二叉树题目

文章目录 一、单值二叉树二、检查两颗树是否相同三、另一棵树的子树四、二叉树的前序遍历五、对称二叉树 一、单值二叉树 单值二叉树 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true&#xff…

AD原理图检查ERC(编译检查)

原理图的编译: 原理图界面选择菜单栏的:工程---->Compile PCB Project 也可以项目管理栏右击对应项目文件 在右下角,点击panels---->Message,就可以打开Message界面 原理图的常用检测: 原理图界面选择菜单…

kv键值对快速转换为json串(字典类型) | 批量添加双引号

从浏览器中复制的以下数据, 并不能直接使用 refresh:0 start:0 count:20 selected_categories:%7B%7D uncollect:false playable:true tags:在python中需转为字典类型 {refresh: 0,start: 0,count: 20,selected_categories: %7B%7D,uncollect: false,playable: true,tags: , …

SIMD系列-GATHER/SCATTER操作

SIMD系列-GATHER/SCATTER操作 众所周知,SIMD寄存器可以使用LOAD/STORE操作与标量域(或者更准确的说是内存)进行通信。这些操作的缺点是:只允许移动内存中连续的数据元素。然而,我们代码中,经常需要访问非连…

浅谈大数据软件的功能性分析

在当今时代的潮流中,工作中遇到大数据处理的时候非常多,因此需要一些大数据分析软件帮助人们进行工作。由于这些软件针对的对象不同,因此使用方法也不同,那么为了帮助更多的人了解大数据分析软件,我们就对这些软件的功…

【Linux命令200例】mc一个十分实用的文件管理器

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,2023年6月csdn上海赛道top4。 🏆本文已收录于专栏:Linux命令大全。 🏆本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…