| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Feign 应用之 RequestInterceptor 拦截器,超实用指南 -> 正文阅读 |
|
[Java知识库]Feign 应用之 RequestInterceptor 拦截器,超实用指南 |
前言
思考一下,你目前正在使用微服务体系,一个普通的用户请求可能会在微服务之间多次调用,而途径的每个微服务都需要原始请求的部分参数,你会如何传递这些参数? 在之前的文章中,我们了解到,Feign 的本质就是 JAVA 易用版的 HTTP 上层封装,本质还是 想要原始请求参数在微服务之间流转,本质就是在调用下游服务的 HTTP 请求头上添加这些参数,最好还是业务逻辑无侵入性。
一、使用在使用上,我们主要从原生 Feign 和 Spring 体系下整合 Feign 来看具体的使用方式。 你需要注意的是,SpringCloud-OpenFeign 底层也是依赖于 Feign,只不过在使用上提供了一些便利而已。 1. Feign 使用:原生 feign 的拦截器使用方式:
简单的说,实现 RequestInterceptor 拦截器,并手动添加至 feignClient 实例中,在真实请求调用时发挥作用。 2. SpringCloudOpenFeign如果你习惯使用 Spring 框架,那么 SpringCloud-OpenFeign 应该是首选,使用起来也是相当方便,主要有以下几种使用方式: 1)自定义 Bean:
这种是全局有效,会自动添加到所有 FeignClient 的拦截器列表中。 2)配置文件中指定拦截器: 我们除了创建拦截器 bean 实列外,还可以直接在 application.yml 配置文件中添加配置:
这种方式,本质也是在扫描并初始化 FeignClient 的时候,创建拦截器实例,并添加到 FeignClient 实例中。 你也看到了,这种是应用于特定的 feignName,即特定的 FeignClient 实例。 3)FeignClient 的配置选择中指定拦截器:
拦截器应用范围,当前 FeignClient 实例。 3. 区别?Feign 拦截器的使用非常简单:
值得注意的是,SpringCloud-OpenFeign 与原生 Feign 使用方式的主要区别在于, 当然,本质还是原生 Feign 的使用方式而已。 二、原理原理上我们主要了解,feign 拦截器何时发挥作用,以及 Spring 又是如何整合 Feign,我们从第一视角,了解完整的一条链路。 1. Feignfeign-core 核心包提供了动态代理类
是不是很熟悉?典型的 http 调用,在调用之前放置了拦截器处理逻辑。
就这样,我们在自定义拦截器的处理逻辑就被应用到了 http 请求过程中,下游直接从 http 请求中取就完事了。 2. SpringCloudOpenFeign介绍完了拦截器如何应用于 http 请求中,接下来我们看看 Spring 体系下,拦截器如何被加载? 在原生 feign 使用过程中,拦截器是这样添加的:
当然,Spring 有自己强大的 IOC 容器管理,为我们提供了更加方便且优雅的添加方式。 SpringCloud-OpenFeign 提供了注解 我们知道 Spring 在创建 bean 的过程中,可以通过 配置、yaml 属性等解析 bean 的参数并注入,我们的拦截器也是这个时候被添加,对应了我们使用篇的几种方式。 关于 FeignClient bean 的创建,我们可以主要关注
值得注意的, feign 的拦截器可以定义多个。如果你定义了多个拦截器 bean 的话,都会被注入。 不过,如果你拦截器的 beanName 出现同名的话,会出现覆盖的情况。 总结本文主要讲解了 feign 拦截器的几种主要应用方式、拦截器的工作入口等。 另外,在 SpringCloud 体系下,我们还介绍了拦截器如何被自动扫描并装配到 FeignClient 的 bean 实例中。 feign 拦截器的应用应该是非常广泛的,如果你使用的 SpringCloud 体系,应该更有感触。我们一般可以用来权限认证、请求头参数传递 … 在笔者的生产项目中,一般是将其放在公共包里,每个微服务项目直接依赖公共包,便可实现参数的上下游传递,十分方便!!! 相关参考: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/10 15:46:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |