基于Feign接口的全链路拦截器

news2024/11/19 15:39:45

1、前言

        单体应用时,我们经常会把一些共享数据,比如登录信息等放在session里面,当然也可以放在ThreadLocal里面。随着业务复杂度的提高,分布式应用越来越主流。单机的存储的思想已经不适用了,共享session应运而生,比如nosql、session复制等技术方案。

        分布式架构中SpringCloud使用尤为广泛。如果想通过Feign接口的调用隐式的传递一些参数,比如用户ID、名称,接口的验签等,我们应该怎么实现呢。Feign为我们提供全链路Request拦截器:feign.RequestInterceptor

        今天通过传递用户名到feign服务端,来使用 RequestInterceptor 来实现, 同时对比一下web的拦截器 HandlerInterceptor 的区别。

2、实现思路

        调用端和服务端是两个不同的服务,ThreadLocal的方式不能横跨里两个服务。feign.RequestInterceptor 接口可以将请求转发到Feign接口对应的服务中。

  • 创建web拦截器,模拟登录请求,将用户名存放到ThreadLocal中。
  •  调用Feign接口之前,会调用 feign.RequestInterceptor接口,将ThreadLocal中信息存放到Feign接口的Request中。
  •  通过Feign接口的Request对象就可以获取用户名

3、最佳实践-调用端

        3.1 调用端-web拦截器模拟登录

public class IWebRequestInterceptor implements AsyncHandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 模拟登录
        Map<String, String> stringStringMap = new HashMap<>();
        stringStringMap.put("username", "admin");
        RequestHolder.set(stringStringMap);
        return AsyncHandlerInterceptor.super.preHandle(request, response, handler);
    }
}

        3.2 调用端-RequestHolder

public class RequestHolder implements AutoCloseable{

    private RequestHolder() {}

    private static final ThreadLocal<Map<String, String>> THREAD_LOCAL = new ThreadLocal<Map<String, String>>();

    public static void set(Map<String, String> map){
        THREAD_LOCAL.set(map);
    }

    public static Map<String, String> get(){
        return THREAD_LOCAL.get() == null ? new HashMap<String, String>() : THREAD_LOCAL.get();
    }

    public static void remove() {
        THREAD_LOCAL.remove();
    }

    @Override
    public void close() throws Exception {
        THREAD_LOCAL.remove();
    }
}

        3.3 调用端-调用Feign之前的feign.RequestInterceptor

@Configuration
public class IRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        Map<String, String> stringStringMap = RequestHolder.get();
        if (stringStringMap != null) {
            for (Map.Entry<String, String> entry : stringStringMap.entrySet()){
                template.header(entry.getKey(), entry.getValue());
            }
        }
    }
}

        3.4 调用端-拦截器的配置

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new IWebRequestInterceptor()).addPathPatterns("/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

        调用端的实现,已经实现了用户名传递到服务端。

4、测试结果

服务端结果获取

结果打印:

4、最佳实践-服务端

        服务端本身需要配置就可以从Request中获取Header中的用户名。但是服务端也可能调用其他服务端,资深作为调用端。所以服务端也应该要有和调用端一样的配置,最终把用户名保存再自己的服务的ThreadLocal里面。既可以从ThreadLocal里面去也可以从Request里面取。

        配置同调用端。

5、HandlerInterceptor 和 RequestInterceptor 的区别

  • HandlerInterceptor是 org.springframework.web.servlet(spring-webmvc)包下,而RequestInterceptor 是feign(feign-core)包下。
  • HandlerInterceptor拦截器是需要配置拦截的请求,RequestInterceptor 不用,只需要交给Spring管理即可。
  • HandlerInterceptor优先与RequestInterceptor 执行,RequestInterceptor 在调用Feign接口之前执行

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

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

相关文章

如何度量预测用户付费的误差

在广告&#xff0c;电商&#xff0c;游戏等行业中&#xff0c;预测用户付费是核心的业务场景&#xff0c;能直接帮助提升收入&#xff0c;利润等核心业务指标&#xff0c;堪称预测中的明星。在预测用户付费的系列文章中&#xff0c;结合作者理论和工程实践经验&#xff0c;深入…

C++ make_heap等堆函数的使用

一、介绍 C的STL提供了make_heap、push_heap、pop_heap、sort_heap等算法&#xff0c;它们用来将一个随机存储的数组或者容器等转换为一个heap。这里所说的转换为heap意思是将原来的存储顺序改变&#xff0c;将转换成的堆层序遍历后所得到的元素顺序作为数组或者容器新的元素顺…

用HarmonyOS ArkUI调用三方库PhotoView实现图片的联播、缩放

本文演示如果用HarmonyOS的ArkUI来调用已经上架到三方库中心的社区库。体验HarmonyOS 3最新的API 9&#xff0c;欢迎大家一起参与构建这个万物互联的时代&#xff01; 活动主页 HarmonyOS线上Codelabs挑战赛已经开启&#xff0c;该系列挑战赛将围绕HarmonyOS的基础组件和容器…

ABAQUS计算不收敛问题,排查方法和解决方案都在这儿了

在进行有限元仿真计算时&#xff0c;常常会遇到计算不收敛的问题&#xff0c;而且导致求解不收敛的原因也是多种多样的&#xff0c;处理起来也是相当的麻烦。特别是在利用隐式算法的求解非线性问题时&#xff0c;对静态平衡方程进行迭代求解时极易出现计算的不收敛问题&#xf…

JVM垃圾回收——垃圾收集器(一)

目录 一、垃圾收集器 二、Serial/Serial Old 三、ParNew 收集器 四、Parallel Scavenge收集器 五、Parallel Old收集器 一、垃圾收集器 现阶段可以作为商用的垃圾收集器大概以上几种&#xff0c;ZGC还正在实验阶段&#xff0c;如果两个收集器之间有连线那么表示他们可搭配…

【Linux初阶】Linux环境下的 git 使用 | git的add/commit/push/log/pull/mv/rm/status

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;详细阐述git是什么&#xff0c;git的发展脉络&#xff0c;还有Linux环境下git工具的具体使用方法 &#x1f6a…

关于如何导入OTWB 7型项目

一、简介&#xff1a; 公司最新的 OTWB 7.0 产品&#xff0c;均使用最新版开发开发框架 ThornForest&#xff0c;简称 TF。相较于 Thorn 框架&#xff0c;新版的 TF 框架&#xff0c;在页面编译的方式有比较大的变化。其中最主要的变化是&#xff0c;TF 的编译需要根据不同部署…

深入理解JavaScript——执行上下文与调用栈

前言 在说一个概念前&#xff0c;我们需要确定它的前提&#xff0c;此文以 ECMAScript5 为基础撰写 一句话解释 执行上下文就是一段代码执行时所带的所有信息 执行上下文是什么 《重学前端》的作者 winter 曾经对什么是执行上下文做过这样的解释&#xff1a; JavaScript 标…

基于基于全局差错能量函数的双目图像立体匹配算法matlab仿真,并提取图像的深度信息

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 全局的能量函数公式如下: E(f)Edata(f)Esmooth(f) 其中,Edata 表示能量函数的数据项,意为该像素只考虑自身的视差值的倾向,不考虑 邻域内其他像素的影响;N 表示匹配聚合时的支持窗口;p 表…

应用层-HTTP协议

HTTP概述 HTTP(HyperTextTransferProtocol)是Web应用的应用层协议&#xff0c;定义浏览器如何向Web服务器发送请求以及Web服务器如何向浏览器进行响应。目前主要使用的HTTP/1.0 和HTTP/1.1&#xff0c;尤其以HTTP/1.1 为主流。 HTTP连接 浏览器在向服务器发送请求之前&#…

全日制和非全日制之争,看完六年前的这个文件心里就有数了

在每年的报考咨询中&#xff0c;都能接触到不少关于非全日制硕士的质疑&#xff0c;最大的争议点无非在于社会含金量的问题。其实很多年以前是没有非全日制这一说法的&#xff0c;早些年很多学员也是在职周末读的双证MBA/MPA/MEM这些专业&#xff0c;但证书一律是全日制标识&am…

Oracle Primavera Unifier进度管理器(Schedule Manager)

目录 功能介绍 功能包括 功能介绍 在进度管理器中&#xff0c;Primavera Unifier 用户可以在项目/外壳和项目群级别创建和管理进度表。他们可以创建根据项目或外壳的需求自定义的项目/外壳计划表。当他们为项目/外壳创建第一个时间表表时&#xff0c;Primavera Unifier 会自…

【软考】系统集成项目管理工程师(九)项目成本管理

这里写目录标题 一、项目成本管理概述二、项目成本管理子过程1. 规划成本2. 成本估算3. 制定预算4. 控制成本一、项目成本管理概述 成本 即项目的全过程中所耗用的各种成本,它们的总和为项目成本。成本管理 是在预算范围内确保项目团队完成一个项目所需要开展的管理过程,项目…

前端网页项目-学成在线案例

典型的企业级网站目的是为了整体感知企业级网站布局流程&#xff0c;复习以前知识 准备素材和工具&#xff1a; 学成在线PSD源文件开发工具PS&#xff08;切图&#xff09;/cutterman插件vscode&#xff08;代码&#xff09;chrome&#xff08;测试&#xff09; 案例准备工作&…

[附源码]java毕业设计健身健康规划系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

发布 .NET 7 MAUI / MAUI Blazor 应用到 Windows 应用商店

.NET MAUI 目前仅允许发布 MSIX 包。 原文地址 https://www.cnblogs.com/densen2014/p/16885318.html 创建签名证书发布到本地传送门 https://www.cnblogs.com/densen2014/p/16567384.html 使用 Visual Studio 2022 发布到 Windows 应用商店 由于是发布到 Windows 应用商店,本…

代码中可能会使用

代码中可能会使用 日志 结合兼具举报系统日志 https://www.cnblogs.com/lingduqianli/p/7589173.html 拦截器 https://blog.csdn.net/neymar_jr/article/details/79115839 拦截器应用场景 拦截器本质上是面向切面编程&#xff08;AOP&#xff09;&#xff0c;符合横切关注点…

MYSQL窗口函数(Rows Range)——滑动窗口函数用法

语法介绍 窗口函数语法&#xff1a; <窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名> rows/range子句<用于定义窗口大小> ) <窗口函数>可以放以下两种函数&#xff1a; 1&#xff09; 专用窗口函数&#xff0c;包括…

图文详解Linux基础经典教程(07)——CentOS安装Tomcat

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 之前&#xff0c;我们在CentOS中安装了JDK&#xff1b;接下来&#xff0c;我们在CentOS中安装Tomcat。 安装步骤 在此&#xff0c;详细介绍Tomcat的安装步骤。 第一…

上海亚商投顾:A股缩量调整 AIGC、Web3.0概念抢眼

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪三大指数今日震荡调整&#xff0c;深成指、创业板指午后均跌超1%&#xff0c;黄白二线有所分化&#xff0c;科创50指…