微服务的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. 对称的二叉树 - 力扣࿰…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
