Spring Cloud OpenFegin(创建、发送请求)源码

感觉这一年来学习的知识点都是零零碎碎的,没有形成一个系统闭环,于是萌生了系统总结 Spring Cloud 源码相关的知识点的想法。后续会持续更新系统性的文章。纯原创,debug 总结。今天先简单debug下 OpenFegin 的创建吧。
 
在这里插入图片描述
 

项目结构

标准的 SpringCloud 项目。

  • authservice:认证服务。Oauth2 那套认证逻辑
  • common:公共模块
  • gateway:网关模块
  • xxy-service-api:所有接口都写在这
  • xxy-service:所有接口实现类在这

在这里插入图片描述

user-api 定义了一个 getUser 接口
在这里插入图片描述

具体的 getUser 接口的实现是在认证服务里面(authservice)

在这里插入图片描述

利用 OpenFegin 可以很轻松的实现,不同服务间接口的互相调用。接下来去看源码。

在这里插入图片描述
在这里插入图片描述

分析 @FeignClient 注解

 
直接点击进入 FeignClient 所在的源码包里面分析,如下图,然后大概看到一个名字为 FeignClientFactoryBean 的类,毫不犹豫的点进去看 FeignClientFactoryBean 就行
 
在这里插入图片描述
 
可以看到 FeignClientFactoryBean 还实现了Spring 提供的一些扩展方法: InitializingBean( populateBean 属性填充完成后,进行初始化 Bean)、ApplicationContextAware(用来获取Spring 上下文对象)、BeanFactoryAware。主要还是看和 FeignClientFactoryBean相关的就行。直接把 getObject 方法点到底就行。下面贴我 debug 的时序流程图,沿着圈红的方法点,嵌套这么多方法.
 
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
 

ok 点到底我们发现我们用到的Fegin 其实就是一个Jdk代理对象,里面织入了一个 InvocationHandler 的增强逻辑。每次我们调用Fegin 接口前,都会先掉 InvocationHandler 增强逻辑。到此 Fegin 的创建源码就结束了。

   InvocationHandler handler = this.factory.create(target, methodToHandler);
    T proxy = Proxy.newProxyInstance(target.type().getClassLoader(), new Class[]{target.type()}, handler);
    Iterator var12 = defaultMethodHandlers.iterator();

小结OpenFegin创建流程

 
通过Spring 的 SPI功能扫描,将定义好的Fegin接口生成BeanDefinition(估计也是替换BeanClass为FactoryBean),然后利用 FactoryBean批量进行创建,然后通过Jdk动态代理,将增强逻辑织入到我们的Fegin代理对象中。具体细节没有进行细看,因为debug的过程中看到工厂Bean我就大概知道创建流程了。和我之前手写过的Mybatis动态生成Mapper的思想差不多。

手写 Mybatis-plus 基础架构(工厂模式+ Jdk 动态代理统一生成代理 Mapper)

OpenFegin参数组装源码

 
入口AbstractLoadBalancerAwareClient类下面的executeWithLoadBalancer方法。限于篇幅,中间的过程就不一一贴出来了,直接展示关键节点。

通过debug我们发现,当发起 http://localhost:9002/xxy-course/getUser 的请求后,最终经过lb负载均衡,会将请求转换成我们的真实请求地址http://192.168.11.101:8111/getUser

在这里插入图片描述

如何组装url的,源码位于LoadBalancerContext类下面的reconstructURIWithServer方法,没啥好看的,就是参数拼接。
 在这里插入图片描述

OpenFegin发送请求源码

通过debug,可以看到最终是调用FeignLoadBalancer下面的execute方法去发起的网络请求。
在这里插入图片描述
中间过程有点多,直接贴debug时序图
在这里插入图片描述
在这里插入图片描述

最终来到fegin.Client类下面的convertAndSend方法里面。通过抽丝剥茧可以看到fegin是通过HttpURLConnection进行的发起网络请求,而不是我先前以为Fegin其实就是Httpclient的包装。小丑竟然是我自己
在这里插入图片描述

在这里插入图片描述
到此fegin的整个调用以及创建链路源码全部看完,其中的负载均衡、解码器部分的源码后续更新。

在这里插入图片描述

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

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

相关文章

JavaScript数组操作完全手册

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ 目录 ✨ 前言 第一节:数组的定义和创建 1.1 数组字面量 [] 1.2 Array构造函数 1.3 Array.of() …

嵌入式-C语言-ASCII码(字符)转换二进制和十六进制

一:ASCII码是什么? 问:ASCII码是什么? 答:ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码)是一种用于表示字符的标准编码系统。它使用7位或8位…

书生·浦语大模型--第一节课

书生浦语大模型--第一节课 引言书生浦语大模型发展历程大模型的应用 全链条开放体系数据开源预训练工具微调微调框架 评测工具智能体应用框架工具箱 总结 参考链接 目标:掌握大语言模型开发和应用技能 引言 大语言模型成为学术界和工业界的热门话题。 起源于2018年…

面向设计师的11个必备AI工具

在当今快速发展的设计领域,人工智能(AI)工具已成为不可或缺的创新催化剂。这些工具专门用于提高效率和创造力,从而重新定义传统的设计方法。AI正在彻底改变设计师的工作方式,从自动处理任务到发掘新的创造力机会&#…

Python爬虫必学数据库:MongoDB

微信公众号:愤怒的it男,超多Python技术干货文章。 MongoDB由C编写而成,是免费开源跨平台的非关系型数据库,与关系型数据库不同,MongoDB将数据存储在类似JSON的文档中,这使得数据库非常灵活和可伸缩。 一、环…

开放平台系统架构设计

一、概述 背景与目标 本开放平台旨在构建一个可扩展、高可用的生态体系,通过提供统一标准的API接口和SDK工具包,让第三方开发者能够安全、高效地接入我们的服务和资源,实现业务的互联互通。 定位与功能描述 系统主要包含用户认证授权、资…

TS2307: Cannot find module ‘./App.vue‘ or its corresponding type declarations.

目录 1. 问题描述2. 解决方案一:VSCode Volar(官方推荐)3. 解决方案二:WebStorm 2023.2 (官方推荐)4. 解决方案三:禁用严格类型检查选项(不推荐)5. 解决方案四&#xff…

Power BI - 5分钟学习修改数据类型

每天5分钟,今天介绍Power BI修改数据类型 Power BI加载数据时,会尝试将源列的数据类型转换为更高效的存储、计算和数据可视化的数据类型。 例如,如果从Excel导入的值的列没有小数值,Power BI Desktop会将整个数据列转换为整数数据…

Spring学习之——事务控制

Spring中的事务控制 说明: JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案。 Spring框架为我们提供了一组事务控制的接口。具体在后面的小节介绍。这组接口是在spring-tx.RELEASE.jar中。 spri…

软件测试|如何在Pycharm中配置文件头部信息

简介 PyCharm是一款功能强大的Python集成开发环境(IDE),在开发过程中,我们经常需要在代码文件的开头添加固定的文件说明信息,例如版权声明、作者信息、创建日期等。手动添加这些信息可能会很繁琐,但是PyCh…

【51单片机系列】串口通信模块

文章目录 一、计算机串行通信基础二、串行通信的基本概念2.1、异步通信与同步通信2.2、串行通信的传输方向2.3、串行通信常见的错误校验2.4、传输速率 三、串行通信接口标准3.1、RS-232C接口3.2、RS-422A3.3、RS-485接口 四、80C51的串行口4.1、80C51串行口的控制寄存器4.2、80…

数集 - 240109 - 数集期末速成

TAG - 数集、期末、速成 数集、期末、速成 数集、期末、速成 复习提纲 1、静态逻辑设计和晶体管尺寸设计 2、逻辑组合速度估算 3、传输门规则和设计、动态pmos,nmos设计及输出波形 4、第三章涉及的工艺流程 5、时序电路的时序分析 6、全加器和乘法器设计 7、非挥发存储单…

给自己创建的GPTs添加Action(查天气)

前言 在这篇文章中,我将分享如何利用ChatGPT 4.0辅助论文写作的技巧,并根据网上的资料和最新的研究补充更多好用的咒语技巧。 GPT4的官方售价是每月20美元,很多人并不是天天用GPT,只是偶尔用一下。 如果调用官方的GPT4接口&…

redo,binlog的两阶段提交

回顾流程 执行更新语句 UPDATE t_user SET name xiaolin WHERE id 1; 执行器负责具体执行,会调用存储引擎的接口,通过主键索引树搜索获取 id 1 这一行记录: 如果 id1 这一行所在的数据页本来就在 buffer pool 中,就直接返回…

【网络技术】【Kali Linux】Wireshark嗅探(七)超文本传送协议(HTTP)

一、实验目的 本次实验使用Wireshark流量分析工具进行网络嗅探,旨在了解超文本传送协议(HTTP)的工作原理。 二、HTTP协议概述 超文本传送协议( H yper T ext T ransfer P rotocol, HTTP)是互联网应用层的一个重要协…

Prometheus实战篇:Prometheus监控mongodb

Prometheus实战篇:Prometheus监控mongodb 准备环境 docker-compose安装mongodb docker-compose.yaml version: 3 services:mongo:image: mongo:4.2.5container_name: mongorestart: alwaysvolumes:- /data/mongo/db: /data/dbport:- 27017:27017command: [--auth]enviromen…

索引、映射、文档

一个索引就是一个拥有几分相似特征的文档的集合,索引必须全部是小写字母的。 映射是定义一个文档和它所包含的字段如何被存储和索引的过程。 文档就是索引中存储的一条条数据。 通俗来理解就是:索引就是数据库中的表,而映射就是定义表时的…

IDEA 常用快捷键大全(建议收藏)

代码开发时 常用快捷键 快捷键功能使用建议CtrlAltOOptimize imports 比较实用 去除导入的无用的包CtrlAltIAuto-indent line(s) 比较实用 自动缩进代码CtrlAltLReformat code 比较实用 格式化选中的代码CtrlAltShiftL 比较实用 格式化整个文件TabIndent 比较实用 缩进Sh…

QT qss文件设置样式

方式一 (单个) 方式二 (全局) 所有按钮都会采用这个样式。 方式三 (qss文件) 创建资源文件 创建qss文件(Button.qss) 引用qss文件 QApplication a(argc, argv);QString qss;QFile…

智汇云舟受邀出席《城市轨道交通公共安全防范安全评价标准》专家评审会

1月3日,由中国城市公共交通协会归口的《城市轨道交通公共安全防范安全评价标准》(以下简称“《标准》”)送审稿审查会顺利召开。该标准由同方威视技术股份有限公司、上海新海信通信息技术有限公司和中安保实业集团有限公司主编,北…