OpenFeign原理浅析

chatgpt/2023/9/27 7:16:55

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.exyb.cn/news/show-5313028.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

vue sku商品规格多选

vue sku商品规格多选 1.创建一个数据对象,用于存储SKU的选中状态。例如,可以使用一个数组来表示选中的SKU,每个元素代表一个SKU选项的id。 data() {return {selectedOptions: []} }2.在SKU选项列表中,使用v-bind:class绑定一个计…

【Rasa】入门案例学习

Rasa初体验--构建对话机器人 NLU数据 version: "3.1"nlu:- intent: greetexamples: |- Hi- Hey!- Hello- Good day- Good morning- intent: subscribeexamples: |- I want to get the newsletter- Can you send me the newsletter?- Can you sign me up for the ne…

C语言指针进阶-1

本篇文章带来 1. 字符指针 2. 数组指针 3. 指针数组的相关知识详细讲解! 如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源,让我们一起加油,一起奔跑,让我们顶峰相见!&#…

AttributeError: ‘DataFrame‘ object has no attribute ‘iteritems‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【LeetCode 算法】Linked List Cycle II 环形链表 II

文章目录 Linked List Cycle II 环形链表 II问题描述:分析代码哈希快慢指针 Tag Linked List Cycle II 环形链表 II 问题描述: 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链…

【LeetCode每日一题合集】2023.7.24-2023.7.30

文章目录 771. 宝石与石头代码1——暴力代码2——位运算集合⭐(英文字母的long集合表示) 2208. 将数组和减半的最少操作次数(贪心 优先队列)2569. 更新数组后处理求和查询⭐⭐⭐⭐⭐(线段树)TODO2500. 删除…

tinymce4/5实现将word中内容(文字图片等)直接粘贴至编辑器中——利用插件tinymce-powerpaste-plugin

TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有:UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 TinyMCE的优势: 开源可商用,基于LGPL2.1 插件丰富,自带插件基本涵盖日常…

Python - Opencv + pyzbar实时摄像头识别二维码

直接上代码: import cv2 from pyzbar.pyzbar import decodecap cv2.VideoCapture(0) # 打开摄像头while True: # 循环读取摄像头帧ret, frame cap.read()# 在循环中,将每一帧作为图像输入,使用pyzbar的decode()函数识别二维码barcodes …
推荐文章