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

news2024/11/5 18:30:29

前情回顾

上篇我们已经完成了网关对所有微服务请求的拦截以及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.coloradmin.cn/o/2230988.html

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

相关文章

ubuntu 24.04中安装 Easyconnect,并解决版本与服务器不匹配问题

下载安装包 下载地址 https://software.openkylin.top/openkylin/yangtze/pool/all/ 页面搜索 easyconnect 选择 easyconnect_7.6.7.3.0_amd64.deb安装 sudo dpkg --install easyconnect_7.6.7.3.0_amd64.deb卸载 sudo dpkg --remove easyconnect出现的问题 安装以后第…

Learn QOpenGL 读取obj模型

/* ** File name: OpenGLModelWidget.h ** Author: ** Date: 2024-10-31 ** Brief: 读取模型文件并渲染的OpenGL控件 ** Copyright (C) 1392019713qq.com All rights reserved. */#ifndef OpenGLModelWidget_H #define OpenGLModelWidget_H#include…

C++入门基础知识133—【关于C 库函数 - asctime()】

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C 库函数 - asctime()的相关内容&#x…

Java版企电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所…

沟通工具选错了,团队效率会下降多少?

沟通工具的选择对团队的工作效率和协作能力有着直接影响。选用不当的沟通工具可能导致信息传递不畅、工作效率低下、团队士气下降等严重后果。具体来说,沟通不畅会造成误解、信息延迟和团队合作困难。例如,使用不适合团队规模和工作流程的工具&#xff0…

ElasticSearch - Bucket Script 使用指南

文章目录 官方文档Bucket Script 官文1. 什么是 ElasticSearch 中的 Bucket Script?2. 适用场景3. Bucket Script 的基本结构4. 关键参数详解5. 示例官方示例:计算每月 T 恤销售额占总销售额的比率百分比示例计算:点击率 (CTR) 6. 注意事项与…

Java中IO的高级操作

目录 缓冲流 缓冲字节输入流: 缓冲字节输出流: 缓冲字符输入流: 缓冲字符输出流: 转换流 转换流字符输入: 转换流字符输出: 练习案例: 打印流 字节打印流: 字符打印流&a…

VsCode中搭建 Rt-Thread 开发环境(编译,调试,下载)

VsCode中搭建 Rt-Thread 开发环境(编译,调试,下载) 文章目录 VsCode中搭建 Rt-Thread 开发环境(编译,调试,下载)一 . 下载rt-thread源码二. 安装env脚本环境三 . 配置工具链3.1 使用…

Pinctrl子需要中client端使用pinctrl过程的驱动分析

往期内容 本专栏往期内容: Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析:imx_pinctrl_soc_info结构体 input子系统专栏…

初探Flink的序列化

Flink中的序列化应用场景 程序通常使用(至少)两种不同的数据表示形式[2]: 1. 在内存中,数据保存在对象、结构体、列表、数组、哈希表和树等结构中。 2. 将数据写入文件或通过网络发送时,必须将其序列化为字节序列。 从内存中的表示到字节序列…

项目一:使用 Spring + SpringMVC + Mybatis + lombok 实现网络五子棋

一:系统展示: 二:约定前后端接口 2.1 登陆 登陆请求: GET /login HTTP/1.1 Content-Type: application/x-www-form-urlencodedusernamezhangsan&password123登陆响应: 正常对象:正常对象会在数据库中存储&…

CentOS7配置静态IP(非解决方法指导,纯笨蛋记录)

一、这篇博客算是记录我终于解决我安装的虚拟机ping不通外网的问题,前前后后我尝试了很多次花了很多时间,最后弄完发现其实都是因为我之前根本不知道什么是虚拟机的网络配置。。。。。 这个链接介绍了vmware虚拟机三种网络模式及配置详解_vmware 特定虚…

opencv-day2-图像预处理1

图像预处理 在计算机视觉和图像处理领域,图像预处理能够提高后续处理(如特征提取、目标检测等)的准确性和效率。 常见的图像预处理操作: 图像色彩空间转换 图像大小调整 图像仿射变换 图像翻转 图像裁剪 图像二值化处理 图…

3DDFA-V3——基于人脸分割几何信息指导下的三维人脸重建

1. 研究背景 从二维图像中重建三维人脸是计算机视觉研究的一项关键任务。在虚拟现实、医疗美容、计算机生成图像等领域中,研究人员通常依赖三维可变形模型(3DMM)进行人脸重建,以定位面部特征和捕捉表情。然而,现有的方…

Ubuntu系统如何实现键盘按键映射到其他按键(以 Ctrl+c 映射到 F3,Ctrl+v 映射到 F4 为例)

文章目录 写在前面1. 功能描述2. 实现步骤2.1 安装AutoKey2.2 软件设置2.2.1 软件设置 2.3 测试是否安装成功 参考链接 写在前面 自己的测试环境: Ubuntu20.04 1. 功能描述 Ubuntu系统使用Ctrlc 、Ctrlv 进行复制粘贴操作的时候,时间长了就会出现小拇指…

【Clickhouse】客户端连接工具配置

ClickHouse 是什么 ClickHouse 是一个分布式实时分析型列式存储数据库。具备高性能,支撑PB级数据,提供实时分析,稳定可扩展等特性。适用于数据仓库、BI报表、监控系统、互联网用户行为分析、广告投放业务以及工业、物联网等分析和时序应用场…

postman的脚本设置接口关联

pm常用的对象 变量基础知识 postman获取响应结果的脚本的编写 下面是购物场景存在接口信息的关联 登录进入---搜索商品---进入商品详情---加入购物车 资源在附件中,可以私聊单独发送 postman的SHA256加密 var CryptoJS require(crypto-js);// 需要加密的字符串 …

Qt 文件目录操作

Qt 文件目录操作 QDir 类提供访问系统目录结构 QDir 类提供对目录结构及其内容的访问。QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它还可以用于访问 Qt 的资源系统。 Qt 使用“/”作为通用目录分隔符,与“/”在 URL 中用作路径分隔符…

qt QCheckBox详解

QCheckBox 是 Qt 框架中的一个控件,用于创建复选框,允许用户进行选择和取消选择。它通常用于表单、设置界面和任何需要用户选择的场景。 QCheckBox继承自QAbstractButton类,因此继承了按钮的特性。它表示一个复选框,用户可以通过…

读数据工程之道:设计和构建健壮的数据系统26数据建模

1. 数据建模 1.1. 良好的数据架构必须反映出使用这些数据的组织的业务目标和业务逻辑 1.2. 数据湖1.0、NoSQL和大数据系统的兴起,使工程师们有时是为了合理的性能提升去忽略传统的数据建模 1.3. 数据在企业中的地位急剧上升,人们越来越认识到&#xf…