微服务的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. 对称的二叉树 - 力扣࿰…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
