当前位置: 首页 > news >正文

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

相关文章:

  • 『运维备忘录』之 RegEx 正则表达式实例汇总
  • 学习JAVA的第十三天(基础)
  • 芋道项目部署问题指南
  • 常用“树”数据结构
  • 通信棒自动化测试工具
  • uni-app 系统状态栏高度CSS变量--status-bar-height
  • istio pod不启动及访问报RBAC错误问题解决
  • JavaWeb Response:设置响应数据
  • 如何更好的引导大语言模型进行编程的高效开发流程?
  • Kali Linux 2024.1
  • Java多线程注意事项(初级程序员必看)
  • 蓝桥杯练习题——dp
  • Python图像处理【21】基于卷积神经网络增强微光图像
  • SpringBoot接口防抖(防重复提交)的一些实现方案
  • Apache Flink连载(三十九):Kuberneters 部署案例
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Android 控件背景颜色处理
  • Angular4 模板式表单用法以及验证
  • AngularJS指令开发(1)——参数详解
  • angular组件开发
  • flutter的key在widget list的作用以及必要性
  • HTML中设置input等文本框为不可操作
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • java中具有继承关系的类及其对象初始化顺序
  • MySQL几个简单SQL的优化
  • node入门
  • ReactNativeweexDeviceOne对比
  • sessionStorage和localStorage
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 多线程事务回滚
  • 高性能JavaScript阅读简记(三)
  • 前端存储 - localStorage
  • 写代码的正确姿势
  • 学习ES6 变量的解构赋值
  • 7行Python代码的人脸识别
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​香农与信息论三大定律
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2)(2.10) LTM telemetry
  • (第61天)多租户架构(CDB/PDB)
  • (二)c52学习之旅-简单了解单片机
  • (二)Eureka服务搭建,服务注册,服务发现
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (十八)三元表达式和列表解析
  • (四)Linux Shell编程——输入输出重定向
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转载)Linux网络编程入门
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes