微服务的Feign到底是什么

news2024/9/29 9:36:33

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的基本源码结构如下:

  1. feign.Feign:Feign的入口类,用于构建Feign客户端;

  2. feign.Request:请求接口,用于定义请求方式、请求头、请求体等信息;

  3. feign.Response:响应接口,用于封装响应结果;

  4. feign.Target:目标接口,用于存储请求的目标信息,例如服务名称、请求路径等;

  5. feign.Contract:契约接口,用于定义请求接口和目标接口之间的关系;

  6. feign.Client:客户端接口,用于定义如何发送请求和接收响应;

  7. feign.codec.Decoder:解码器接口,用于将响应结果解码为Java对象;

  8. feign.codec.Encoder:编码器接口,用于将请求参数编码为请求体;

  9. feign.codec.ErrorDecoder:错误解码器接口,用于将HTTP响应中的错误信息解码为Feign的异常;

  10. feign.Logger:日志接口,用于记录请求和响应的详细信息;

  11. feign.Retryer:重试接口,用于定义请求失败后的重试策略;

  12. feign.Target.HardCodedTarget:目标接口的默认实现类,用于存储目标信息;

  13. feign.Contract.Default:契约接口的默认实现类,用于使用默认的注解方式定义请求接口和目标接口之间的关系;

  14. feign.Client.Default:客户端接口的默认实现类,用于使用java.net.HttpURLConnection发送请求和接收响应;

  15. feign.codec.Decoder.Default:解码器接口的默认实现类,用于使用Jackson将响应结果解码为Java对象;

  16. feign.codec.Encoder.Default:编码器接口的默认实现类,用于将请求参数编码为请求体;

  17. feign.codec.ErrorDecoder.Default:错误解码器接口的默认实现类,用于将HTTP响应中的错误信息解码为Feign的异常;

  18. feign.Logger.JavaLogger:日志接口的默认实现类,用于使用java.util.logging.Logger记录日志;

  19. 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() 方法中,以便在请求完成后对响应进行拦截和处理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

目标检测论文阅读:CBNet算法笔记

标题:CBNet: A Composite Backbone Network Architecture for Object Detection 期刊:TIP2022 论文地址:https://ieeexplore.ieee.org/document/9932281/ 官方代码:https://github.com/VDIGPKU/CBNetV2 作者单位:北京大…

【正点原子FPGA连载】第二十章AXI4接口之DDR读写实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十章AXI4接口…

如何查看Spring Boot各版本的变化

目录 1.版本 2.基础特性和使用 3.新增特性和Bug修复 1.版本 打开Spring官网,点进Spring Boot项目我们会发现在不同版本后面会跟着不同的标签: 这些标签对应不同的版本,其意思如下: GA正式版本,通常意味着该版本已…

VsCode安装PlatformIO 开发ESP arduino,买的板子或者随便ESP,PlatformIO添加Board(不是自定义Board)

这次主要记录怎么给新建选板子的时候没有的板子下程序 我这里是一块 WiFi Kit 32 (V3) PlatformIO里面只有到V2 先从头开始,安装PlatformIO 安装PlatformIO 直接搜索安装 安装有时候会比较慢,左侧出现蚂蚁图标之后点击会显示 右下角会提示正在安…

【神经网络】Transformer基础问答

1.Transforme与LSTM的区别 transformer和LSTM最大的区别就是LSTM的训练是迭代的,无法并行训练,LSTM单元计算完T时刻信息后,才会处理T1时刻的信息,T 1时刻的计算依赖 T-时刻的隐层计算结果。而transformer的训练是并行了&#xff0…

AndroidStudio打包HBuilderX的H5+项目为安卓App【一次过,无任何异常报错】

目录 1.查看HBuilderX的版本号 2.下载Dcloud上对应的安卓SDK 3.下载完安卓SDK后,我们解压它,注意不要放在任何有中文组成的文件夹中【是否有中文决定于你鼠标单击上面路径后,第一张图还没鼠标单击,第二张已鼠标单击&#xff0c…

【前端工程化】01-Node.js基础

Node.js基础认识NodeNode的定义Node的应用场景Node的安装和版本管理Node的基本操作Node.js执行文件Node的参数传递Node的REPL认识Node Node的定义 Node.js是一个基于V8 JavaScript引擎的JavaScript运行时环境 Node.js为JavaScript提供了一些服务器级别的操作API 文件读写网…

背靠“湘潭系”的谭新乔,能带领湖南裕能再上一个台阶吗?

文丨熔财经作者|kinki近日,磷酸铁锂正极材料龙头湖南裕能正式登陆A股,上市当天市值超过了400亿元,投资者中一签可赚1.49万元,可谓近年低迷的资本市场中一支“大肉签”。不过在 “开门红”之后,湖南裕能的股价便一路下挫…

ETL工具(kettle) 与 ETL产品(BeeloadBeeDI) 差之毫厘,谬以千里

E T L——是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。工具——原指工作时所需用的器具,后引申为达…

Clickhouse学习(一):MergeTree概述

MergeTree一、Clickhouse表引擎概述二、MergeTree表引擎<一>、ReplacingMergeTree引擎<二>、SummingMergeTree引擎<三>、AggregatingMergeTree引擎三、MergeTree分区一、Clickhouse表引擎概述 MergeTree表引擎:允许根据日期和主键创建索引 1、ReplacingMerge…

实践IC-GVINS: 以惯导为核心的GNSS-Visual-INS组合导航系统

视觉导航系统对环境比较敏感&#xff0c;受到光照变化、重复纹理、动态物体等影响&#xff1b;惯性导航系统(INS)则完全自主工作&#xff0c;不受外部环境影响&#xff0c;能够实现连续、高频的自主导航&#xff0c;但其误差发散较快。两者组合能够取长补短&#xff0c;形成视觉…

毕业设计 基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线设计

基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线设计1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STM32F103C8T6核心系统电路设计2.2心率检测电路设计2.3 TFT2.4寸彩屏电路设计3、部分代码展示3.1 ADC初始化3.2 获取ADC采样值3.3 LCD引脚初始化3.3 在LCD指定位置显…

15 Nacos客户端实例注册源码分析

Nacos客户端实例注册源码分析 实例客户端注册入口 流程图&#xff1a; 实际上我们在真实的生产环境中&#xff0c;我们要让某一个服务注册到Nacos中&#xff0c;我们首先要引入一个依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId>&l…

Android与flutter混合开发

这里我使用的android studio版本是2020.3.1&#xff1b;flutter版本2.5.3。此前在网上搜索的很多教教程版本都不一样&#xff0c;新版的IDE和SDK让我遇到了很多坑故这里整理一下。一、创建项目1.在Android项目中点击File->New->New Flutter Project。File->New->Ne…

认识STM32和如何构建STM32工程

STM32介绍什么是单片机单片机(Single-Chip Microcomputer)是一种集成电路芯片&#xff0c;把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种/0口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电…

快速找到外贸客户的9种方法(建议收藏)

所有外贸企业想要做好外贸出口的头等大事&#xff0c;就是要快速的找到优质的外贸客户和订单&#xff0c;没有订单的达成&#xff0c;所有的努力都是图劳&#xff0c;还有可能会陷入一种虚假的繁荣&#xff0c;每天都很忙&#xff0c;但是没有结果。今天&#xff0c;小编就来分…

在VScode中添加Linux中的Docker容器中的Python解释器

VScode编辑器在安装好Python插件之后会自动选择环境变量中排序最高的那一个解释器作为默认解释器&#xff0c;而想要额外添加新的Python解释器就需要自己设置。 VScode编辑器安装在本地电脑 支持Python的docker安装在远程服务器 第一步&#xff0c;在/usr/local/下新建pytho…

Telnet 基础实验1: Telnet 实验

Telnet 基础实验1&#xff1a; Telnet 实验 拓扑图 配置命令 R1 的配置 undo ter mo sys sys R1 interface g0/0/0 ip address 192.168.1.1 255.255.255.0 qR2 的配置 undo ter mo system-view sysname R2 interface g0/0/0 ip address 192.168.1.2 255.255.255.0 q两台设…

微信小程序和webview使用postMessage交互

小程序和webview能交互&#xff0c;但是没有你想的那个完美小程序向webview传递参数只能使用url携带参数webview向小程序传递参数可以使用postMessage, 但是注意了&#xff0c;postMessage只会在特定的时机执行&#xff0c;请看官方文档由此可见&#xff0c;如果你想点击webvie…

深度剖析指针(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是指针噢&#xff0c;在学习C语言的过程中&#xff0c;指针算是一个比较重要的内容&#xff0c;当然&#xff0c;难度也是比较大的&#xff0c;那么现在就让小雅兰来带大家进入指针的世界吧 字符指针 数组指针…