微服务的Feign到底是什么
Feign是什么
分区是一种数据库优化技术,它可以将大表按照一定的规则分成多个小表,从而提高查询和维护的效率。在分区的过程中,数据库会将数据按照分区规则分配到不同的分区中,并且可以在分区中使用索引和其他优化技术来提高查询效率。
Feign底层实现了Java的动态代理机制,可以根据接口定义动态生成接口的实现类。当客户端通过Feign发起HTTP请求时,Feign会通过动态代理机制把HTTP请求转换成接口方法的调用,同时将方法参数序列化成HTTP请求的参数,并发起HTTP请求。HTTP响应返回后,Feign会将响应反序列化成对应的Java对象,并返回给客户端。
Feign的作用
在Feign中,可以通过注解的方式定义HTTP请求的参数和返回值类型、HTTP请求的URL、HTTP请求的方法等信息。在调用Feign的接口方法时,Feign会根据注解的信息和方法参数构建HTTP请求,并发起HTTP请求。同时,Feign还支持使用自定义的Encoder和Decoder对请求和响应的参数进行序列化和反序列化,方便自定义的HTTP参数格式和协议。
Feign还提供了可扩展的接口和实现类,可以通过继承和实现这些接口和类,实现自定义的HTTP请求和响应的拦截器、错误处理器等功能。例如,可以通过实现RequestInterceptor接口,实现对HTTP请求的拦截和修改,以满足自定义的HTTP协议要求。
Feign的源码结构
Feign的基本源码结构如下:
feign.Feign:Feign的入口类,用于构建Feign客户端;
feign.Request:请求接口,用于定义请求方式、请求头、请求体等信息;
feign.Response:响应接口,用于封装响应结果;
feign.Target:目标接口,用于存储请求的目标信息,例如服务名称、请求路径等;
feign.Contract:契约接口,用于定义请求接口和目标接口之间的关系;
feign.Client:客户端接口,用于定义如何发送请求和接收响应;
feign.codec.Decoder:解码器接口,用于将响应结果解码为Java对象;
feign.codec.Encoder:编码器接口,用于将请求参数编码为请求体;
feign.codec.ErrorDecoder:错误解码器接口,用于将HTTP响应中的错误信息解码为Feign的异常;
feign.Logger:日志接口,用于记录请求和响应的详细信息;
feign.Retryer:重试接口,用于定义请求失败后的重试策略;
feign.Target.HardCodedTarget:目标接口的默认实现类,用于存储目标信息;
feign.Contract.Default:契约接口的默认实现类,用于使用默认的注解方式定义请求接口和目标接口之间的关系;
feign.Client.Default:客户端接口的默认实现类,用于使用java.net.HttpURLConnection发送请求和接收响应;
feign.codec.Decoder.Default:解码器接口的默认实现类,用于使用Jackson将响应结果解码为Java对象;
feign.codec.Encoder.Default:编码器接口的默认实现类,用于将请求参数编码为请求体;
feign.codec.ErrorDecoder.Default:错误解码器接口的默认实现类,用于将HTTP响应中的错误信息解码为Feign的异常;
feign.Logger.JavaLogger:日志接口的默认实现类,用于使用java.util.logging.Logger记录日志;
feign.Retryer.Default:重试接口的默认实现类,用于使用默认的重试策略。这些组件构成了Feign的基本框架,开发者可以根据实际需求自定义各个组件的实现,从而实现自己的Feign客户端。
这些组件构成了Feign的基本框架,开发者可以根据实际需求自定义各个组件的实现,从而实现自己的Feign客户端。
Feign的内部动态代理
Feign是通过动态代理来生成客户端接口的实现类的。在运行时,Feign会动态生成一个代理对象来实现客户端接口,同时会根据客户端接口中定义的注解来生成相应的HTTP请求,然后通过HTTP客户端发送请求,并将响应映射回客户端接口方法的返回类型。
动态代理是一种在运行时创建代理对象的方式,它不需要事先知道代理对象的类,而是在运行时根据需要创建代理对象。Java中有两种方式可以实现动态代理:基于接口的代理和基于类的代理。
Feign使用的是基于接口的动态代理。它的实现基于Java的反射机制,通过反射获取客户端接口的方法和注解信息,然后动态生成代理对象。代理对象在执行方法时,会通过注解信息生成相应的HTTP请求,并将请求发送给服务器。服务器返回响应后,代理对象会将响应映射到客户端接口方法的返回类型中。
Feign使用了第三方库来实现动态代理,例如JDK自带的java.lang.reflect.Proxy和CGLIB库。在默认情况下,Feign使用的是基于JDK自带Proxy的动态代理实现方式。如果客户端接口中定义的方法没有在接口中声明,或者返回类型是一个具体类而不是接口类型,则需要使用CGLIB库来实现代理对象。
Feign的拦截器
Feign是通过动态代理来生成客户端接口的实现类的。在运行时,Feign会动态生成一个代理对象来实现客户端接口,同时会根据客户端接口中定义的注解来生成相应的HTTP请求,然后通过HTTP客户端发送请求,并将响应映射回客户端接口方法的返回类型。
动态代理是一种在运行时创建代理对象的方式,它不需要事先知道代理对象的类,而是在运行时根据需要创建代理对象。Java中有两种方式可以实现动态代理:基于接口的代理和基于类的代理。
Feign使用的是基于接口的动态代理。它的实现基于Java的反射机制,通过反射获取客户端接口的方法和注解信息,然后动态生成代理对象。代理对象在执行方法时,会通过注解信息生成相应的HTTP请求,并将请求发送给服务器。服务器返回响应后,代理对象会将响应映射到客户端接口方法的返回类型中。
Feign使用了第三方库来实现动态代理,例如JDK自带的java.lang.reflect.Proxy和CGLIB库。在默认情况下,Feign使用的是基于JDK自带Proxy的动态代理实现方式。如果客户端接口中定义的方法没有在接口中声明,或者返回类型是一个具体类而不是接口类型,则需要使用CGLIB库来实现代理对象。

在上面的代码中,我们定义了一个 MyResponseInterceptor 类,该类实现了 ResponseInterceptor 接口,并实现了 handleResponse() 方法。在该方法中,我们可以对响应进行自定义的处理,例如打印响应状态码和响应体。
要使用该拦截器,我们需要在 Feign 的构造函数中传入该拦截器的实例,例如:

在上面的代码中,我们将 MyResponseInterceptor 实例传入 Feign.builder() 的 target() 方法中,以便在请求完成后对响应进行拦截和处理。
相关文章:
微服务的Feign到底是什么
Feign是什么 分区是一种数据库优化技术,它可以将大表按照一定的规则分成多个小表,从而提高查询和维护的效率。在分区的过程中,数据库会将数据按照分区规则分配到不同的分区中,并且可以在分区中使用索引和其他优化技术来提高查询效…...
JavaScript 正则表达式
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。搜索模式可用于文本搜索和文本替换。什么是正则表达式?正则表达式是由一…...
【批处理脚本】-1.15-文件内字符串查找命令find
"><--点击返回「批处理BAT从入门到精通」总目录--> 共7页精讲(列举了所有find的用法,图文并茂,通俗易懂) 在从事“嵌入式软件开发”和“Autosar工具开发软件”过程中,经常会在其集成开发环境IDE(CodeWarrior,S32K DS,Davinci,EB Tresos,ETAS…)中,…...
【手撕面试题】JavaScript(高频知识点二)
目录 面试官:请你谈谈JS的this指向问题 面试官:说一说call apply bind的作用和区别? 面试官:请你谈谈对事件委托的理解 面试官:说一说promise是什么与使用方法? 面试官:说一说跨域是什么&a…...
Web学习1_HTML
在学校期间学的Web知识忘了一些,很多东西摸棱两可,现重新系统的学习一下。 首先下载安装完vsc后并下载拓展文件live server(模拟一个服务器) Auto Rename Tag(在写网页时,自动对齐前后标签)在设…...
华为OD机试真题Java实现【靠谱的车】真题+解题思路+代码(20222023)
靠谱的车 题目 程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。 出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。 比如: 23再多一块钱就变为25; 39再多一块钱变…...
【C++入门(下篇)】C++引用,内联函数,auto关键字的学习
前言: 在上一期我们进行了C的初步认识,了解了一下基本的概念还学习了包括:命名空间,输入输出以及缺省参数等相关的知识。今天我们将进一步对C入门知识进行学习,主要还需要大家掌握我们接下来要学习的——引用…...
基于合作型Stackerlberg博弈的考虑差别定价和风险管理的微网运行策略研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
2023年全国最新保安员精选真题及答案8
百分百题库提供保安员考试试题、保安职业资格考试预测题、保安员考试真题、保安职业资格证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 81.以下各组情形都属于区域巡逻中异常情况的是()。 A&#x…...
JavaScript高级程序设计读书分享之6章——MapSet
JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 Map 作为 ECMAScript 6 的新增特性,Map 是一种新的集合类型,为这门语言带来了真正的键/值存储机制。Map 的大多数特性都可以通过 Object 类型实现,但二者之间还是存在…...
改进的 A*算法的路径规划(路径规划+代码+毕业设计)
引言 近年来,随着智能时代的到来,路径规划技术飞快发展,已经形成了一套较为成熟的理论体系。其经典规划算法包括 Dijkstra 算法、A算法、D算法、Field D算法等,然而传统的路径规划算法在复杂的场景的表现并不如人意,例…...
Tina_Linux存储性能参考指南
OpenRemoved_Tina_Linux_存储性能_参考指南 1 概述 1.1 编写目的 介绍TinaLinux 存储性能的测试方法和历史数据,提供参考。 1.2 适用范围 Tina V3.0 及其后续版本。 1.3 相关人员 适用于TinaLinux 平台的客户及相关技术人员。 2 经验性能值 Flash 性能与实…...
NCRE计算机等级考试Python真题(四)
第四套试题1、以下选项中,不属于需求分析阶段的任务是:A.需求规格说明书评审B.确定软件系统的性能需求C.确定软件系统的功能需求D.制定软件集成测试计划正确答案: D2、关于数据流图(DFD)的描述,以下选项中正…...
LeetCode每周刷题总结2.20-2.26
本栏目记录本人每周写的力扣题的相关学习总结。 虽然开新的栏目都没有完成 70.爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 解题思路: 斐波那契数列递归 class Solution {…...
u盘里删除的文件可以恢复吗?分享解决方法
u盘里删除的文件可以恢复吗?不知道使用过U盘的你,是否遇到过这样的问题呢?其实正常情况下,在电脑中操作u盘,并删除相关的文件,删除的文件是不会经过电脑回收站的。想要找回就需要借助相关的恢复工具才能实现。下面小编给大家分享…...
十、vben框架如何使用table来写报表
在项目开发的过程中,有很多特殊的table样式,有的时候后端会用帆软来写报表,但是有的特殊的报表后端就不能支持实现了,那么前端是如何实现的呢,今天我们就来讲讲。 先上效果图: 本次使用的tsx组件来写的报表…...
jQuery:入门
jQuery 入门 Date: January 19, 2023 目标: 能够说出什么是 jQuery 能够说出 jQuery 的优点 能够简单使用 jQuery 能够说出 DOM 对象和 jQuery 对象的区别 jQuery 概述 JavaScript 库 仓库: 可以把很多东西放到这个仓库里面。找东西只需要到仓库里…...
实例3:树莓派呼吸灯
实例3:树莓派呼吸灯 实验目的 通过背景知识学习,了解digital与analog的区别。通过GPIO对外部LED灯进行呼吸控制,熟悉PWM技术。 实验要求 通过python编程,用GPIO控制LED灯,使之亮度逐渐增大,随后减小&am…...
android适配ipv6,请求慢?
先贴一篇我们经常能搜索到的解决方案: Android 在 4G 下访问 IPV6 慢的解决方案 文章很有参考意义,但也并不是所有请求慢的的原因! 本文是另一种原因,有兴趣就继续往下看一看. 使用的okhttp框架,模式支持ipv6和ipv4协议,但两种协议同时存在时…...
【LeetCode】剑指 Offer(10)
目录 题目:剑指 Offer 27. 二叉树的镜像 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 28. 对称的二叉树 - 力扣࿰…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
StarRocks 全面向量化执行引擎深度解析
StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...
欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!
多连接 BLE 怎么设计服务不会乱?分层思维来救场! 作者按: 你是不是也遇到过 BLE 多连接时,调试现场像网吧“掉线风暴”? 温度传感器连上了,心率带丢了;一边 OTA 更新,一边通知卡壳。…...
简约商务通用宣传年终总结12套PPT模版分享
IOS风格企业宣传PPT模版,年终工作总结PPT模版,简约精致扁平化商务通用动画PPT模版,素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...
【Qt】控件 QWidget
控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态:enabled几何:geometrywindows frame 窗口框架的影响 窗口标题:windowTitle窗口图标:windowIconqrc 机制 窗口不透明度:windowOpacity光标:cursor…...
