网关如何传递信息给微服务

前情回顾

上篇我们已经完成了网关对所有微服务请求的拦截以及JWT的登录校验。

客户端和微服务之间的桥梁--网关(身份校验)icon-default.png?t=O83Ahttps://mp.csdn.net/mp_blog/creation/editor/143425484

问题引入

现在的问题是在一些微服务业务中,需要用到用户信息,但是并没有,不能仅仅只是简单的校验,还要把信息传递过去。如何通过网关传递给微服务

思路

网关过滤器中把用户信息写在请求头中发送过去,微服务可以通过注解@RequestHeader再从请求头中获取信息。

衍生问题的思路:对于一个服务中N个业务都需要用到户信息,可以用拦截器把用户信息保存到                                  ThreadLocal  ,避免增加重复的逻辑。

                            对于N个服务,可以把拦截器写在服务外的公共模块,作为依赖引入使用,避免                              重复的定义拦截器。

思路实现

构建新的exchange对象

使用mutate(使改变)方法创建一个新的构造器对exchange对象进行复制并重构,然后修改一些请求头信息,生成一个新的exchange对象,放行的时候,将这个新的对象上下文传递就可以了。

 构造器对request请求进行构建,builder请求构建器,向请求头添加了一个新的头信息“user”

定义外部公共模块,编写MVC拦截器

微服务只要引入这个公共模块依赖,拦截器即可生效。此拦截器不进行拦截,仅仅只做将用户信息保存到ThreadLocal的操作

注:此时拦截器以及配置类是定义在公共模板中的,和微服务不在一个包,是扫描不到配置的

使用springboot的自动装配

使在不同包下的配置类生效:将配置类记录在META-INF/spring.factories中,当应用启动时,会尝试加载此文件。

此时启动网关会报错

Failed to process import candidates for configuration class [com.hmall.gateway.GatewayApplication]; nested exception is java.io.FileNotFoundException: class 

 因为网关也引用了公共模块,也就有了拦截器的MVC配置类。而网关和SpringMVC的架构,目标是不一样的,网关非阻塞式I/O,MVC阻塞式I/O,一起用就产生了冲突

解决:只让此配置类在微服务中生效,使用条件自动装配,微服务都用到了MVC,而MVC的核心API是DispatcherServlet,所以条件就是它。

@ConditionalOnClass: 当某个类在类路径中存在时才装配对应的 bean,即在加载META-INF/spring.factories 前进行条件检查,决定要不要加载某个配置。

所以:只有当类路径中存在DispatcherServlet时,才会加载此配置类,以确保当前应用是一个MVC应用

再启动网关,成功启动。

至此,微服务就可以从ThreadLocal中获取到用户信息了。

预知后事如何,请看下集。

微服务之间的消息传递icon-default.png?t=O83Ahttps://mp.csdn.net/mp_blog/creation/editor/143435763

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

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

相关文章

微服务架构面试内容整理-微服务架构的定义及优势

微服务架构是一种软件架构风格,它将应用程序构建为一组小的、独立的服务,每个服务围绕特定的业务功能进行开发和部署。每个微服务都可以独立运行、独立部署,并通过轻量级的通信机制(如 HTTP/REST、gRPC 或消息队列)进行交互。 微服务架构的优势: 1. 独立性: 每个微服务…

BGP路由优选+EVPN

BGP 的路由优选规则是一套多步决策链,用来确定在多个可行路由中选择最优的路由。BGP 是一种路径向量协议,通过这些优选规则,网络管理员可以控制数据流量的流向,确保网络的稳定性和效率。下面以一个实例来详细说明 BGP 的优选规则及…

Vue3图片懒加载(vue3-lazyload)

Vue2图片懒加载 参考文档:vue3-lazyload 效果如下图:vue3-lazyload0.3.8 在线预览 安装 npm install vue3-lazyload # or yarn add vue3-lazyload # or pnpm add vue3-lazyload引入并注册 import { createApp } from vue import VueLazyLoad from v…

MongoDB 6.0 主从复制配置

以下是 MongoDB 6.0 版本配置主从的详细安装步骤: 1. 安装 MongoDB:可以从官网下载 MongoDB 6.0 的安装包并进行安装,或者使用相应的包管理工具进行安装。 2. 配置主节点:在主节点的 MongoDB 配置文件(默认路径为 …

【快速入行软件测试行业+功能测试必备技能+测试用例快速编写 】--保姆级教程

快速入门功能测试 功能测试是软件测试中最重要的一部分,旨在验证软件系统的各项功能是否按照需求规格说明书的要求正常工作。以下是快速入门功能测试所需的技能、操作步骤、SQL语句编写和用例撰写方法。 1. 功能测试所需技能 基本测试知识: 理解测试类…

ISO 26262与ISO 21434:汽车安全领域的双重保障与交汇探索

ISO 26262和ISO 21434都是关于汽车安全的国际标准,它们在汽车安全领域各自有不同的侧重点,但它们也存在交集。 ISO 26262是一个针对汽车行业的功能安全标准,它主要关注汽车电子和电气系统的安全性。这个标准从概念阶段开始,贯穿了…

Hudi Upsert原理

1. 前言 如果要深入了解Apache Hudi技术的应用或是性能调优,那么明白源码中的原理对我们会有很大的帮助。Upsert是Apache Hudi的核心功能之一,主要完成增量数据在HDFS/对象存储上的修改,并可以支持事务。而在Hive中修改数据需要重新分区或重…

ctfshow web入门文件上传总结

1.web151 前端验证 前端验证&#xff0c;修改html代码&#xff0c;上传还有一句话木马的php文件,之后用蚁剑连接即可找到flag <?php eval($_POST[1])?>2.web152 后端验证&#xff0c;修改mime类型(content-type) burp抓包&#xff0c;修改content-type为image/png …

Java面试题十四

一、Java中的JNI&#xff08;Java Native Interface&#xff09;是什么&#xff1f;它有什么用途&#xff1f; Java中的JNI&#xff08;Java Native Interface&#xff09;是Java提供的一种编程框架&#xff0c;它允许Java代码与本地&#xff08;Native&#xff09;代码&#x…

基于Spring Boot+Vue的助农销售平台(协同过滤算法、限流算法、支付宝沙盒支付、实时聊天、图形化分析)

&#x1f388;系统亮点&#xff1a;协同过滤算法、节流算法、支付宝沙盒支付、图形化分析、实时聊天&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk1…

GitHub每日最火火火项目(11.2)

Cinnamon / kotaemon&#xff1a;“Cinnamon / kotaemon”是一个开源的基于检索增强生成&#xff08;RAG&#xff09;技术的工具&#xff0c;主要用于与你的文档进行聊天。在当今信息爆炸的时代&#xff0c;如何有效地管理和利用文档中的知识变得至关重要。这个项目使用 Python…

手把手写Linux第一个小程序 - 进度条(5种版本)

本专栏内容为&#xff1a;Linux学习专栏&#xff0c;分为系统和网络两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;linux &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

dhcp池没有空闲ip导致手机无法获得ip

得到用户反馈&#xff0c;一个高速项目部的wifi无法接入&#xff0c;让排查原因。 反馈有的手机能接入&#xff0c;有的接入不了。查看ac界面发现有个终端获得的ip是169.254.xxx.xxx。 ip地址是169.254.96.17显然是手机打开wlan开关后&#xff0c;鉴权通过后dhcp过程&#xff0…

雷池社区版compose文件配置讲解--fvm

在现代网络安全中&#xff0c;选择合适的 Web 应用防火墙至关重要。雷池&#xff08;SafeLine&#xff09;社区版免费切好用。为网站提供全面的保护&#xff0c;帮助网站抵御各种网络攻击。 docker-compose.yml 文件是 Docker Compose 的核心文件&#xff0c;用于定义和管理多…

《高频电子线路》—— 振荡器稳定性问题

文章内容来源于【中国大学MOOC 华中科技大学通信&#xff08;高频&#xff09;电子线路精品公开课】&#xff0c;此篇文章仅作为笔记分享。 振荡器稳定性问题 频率准确度 & 频率稳定度 希望频率稳定度越小越好。 频率稳定度分类 影响振荡频率稳定度的参数 振荡频率是和电…

HTMLCSS: 打造跳一跳加载器,点燃用户等待热情

效果演示 这段 HTML 代码创建了一个简单的网页&#xff0c;其中包含一个动画效果&#xff0c;用来模拟一个加载器loading HTML <div class"loader"></div>div创建了一个动画效果的加载器 CSS html, body {width: 100vw;height: 100vh;display: flex…

Nginx 的 Http 模块介绍(上)

Nginx 的 Http 模块介绍&#xff08;上&#xff09; 1. http 请求 11 个处理阶段介绍 Nginx 将一个 Http 请求分成多个阶段&#xff0c;以模块为单位进行处理。其将 Http请求的处理过程分成了 11 个阶段&#xff0c;各个阶段可以包含任意多个 Http 的模块并以流水线的方式处理…

网络:ARP的具体过程和ARP欺骗

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言ARP具体过程ARP欺骗原理总结 前言 本文仅作为ARP具体过程和ARP欺骗的知识总结 硬件类型 &#xff1a;指定发送和接受ARP包的硬件类型&am…

青少年编程与数学 02-003 Go语言网络编程 05课题、DNS

青少年编程与数学 02-003 Go语言网络编程 05课题、DNS 课题摘要:一、DNS二、DNS的主要特点三、DNS的工作原理四、DNS的应用场景包括五、DNS服务器DNS服务器的主要功能&#xff1a;DNS服务器的类型&#xff1a;DNS服务器的工作原理&#xff1a; 六、DNS服务商七、互联网接入1. 注…

Python数据分析入门知识基础和案例(万字长文)

目录 数据分析的重要性 Python数据分析工具链 NumPy数组操作 Pandas数据结构与操作 DataFrame操作 Series操作 数据转换 数据清洗 数据分析案例 数据读取与预处理 数据分析 结果展示 Matplotlib基础绘图 线图 柱状图 散点图 PyEcharts交互式图表 可视化案例展…