SpringCloud 前端-网关-微服务-微服务间实现信息共享传递

目录

1 网关获取用户校验信息并保存至请求头(前端-网关)

2 微服务获取网关中的用户校验信息(网关-微服务)

2.1 一般的做法是在公共的module中添加,此处示例为common 公共配置module中添加

2.2 定义拦截器

2.3 定义注册类

2.4 手动添加注册配置类保证被扫描

3 多个微服务之间共享该信息(微服务-微服务)

3.1 定义请求拦截器RequestInterceptor

4 前端-网关-微服务-微服务间信息共享全流程

4.1 (前端-网关)首先前端发起请求,经过GlobalFilter过滤器判断是否需要登录,需要登录的话进行登录校验,完成登录校验后获取到用户信息,存入上下文中,保存到请求头中。然后由网关传向微服务中。

4.2 (网关-微服务)微服务拦截器拦截从网关发送过来的请求,从请求头中获取到用户信息后会通过ThreadLocal保存使用。

4.3 (微服务-微服务)微服务若再向其他微服务发起请求,则通过OpenFeign提供的RequestInterceptor拦截发出的请求,并进行将用户信息保存在请求头中的操作。


1 网关获取用户校验信息并保存至请求头(前端-网关)

思路是添加过滤器,网关过滤器有两种,分别是:
GatewayFilter:路由过滤器,作用于任意指定的路由;默认不生效,要配置到路由后生效。
GlobalFilter:全局过滤器,作用范围是所有路由;声明后自动生效。
两种过滤器的过滤方法签名完全一致。

此处以GlobalFilter为例实现网关登录校验

首先定义定义全局过滤器并实现两个接口,特别说明Ordered接口是改变其权重,提升其优先级别,保证在pre阶段先执行(若不懂pre阶段请看3 网关处理流程)。过滤器定义逻辑如下,拦截符合条件的请求(常见的是需要登录的请求)-> 登录校验 -> 将信息存入上下文请求头中

@Component
@RequiredArgsConstructor
@EnableConfigurationProperties(AuthProperties.class)
public class AuthGlobalFilter implements GlobalFilter, Ordered {private final AuthProperties authProperties; //配置文件类,开发无需登录路径private final JwtTool jwtTool;  //jwt工具类 private final AntPathMatcher antPathMatcher = new AntPathMatcher(); //路径匹配    //工具类@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//    其中exchange 为上下文,在过滤器链路中负责传递信息//        1.获取request 请求ServerHttpRequest request = exchange.getRequest();
//        2.判断是否需要做登陆拦截if(isExclude(request.getPath().toString())){
//            放行return chain.filter(exchange);}//        3.获取tokenHttpHeaders headers = request.getHeaders();String token = null;List<String> authorization = headers.get("authorization");if(authorization !=null && !authorization.isEmpty()){token = authorization.get(0);}//        4.校验并解析tokenLong userId = null;try {userId = jwtTool.parseToken(token);}catch (UnauthorizedException e){
//            拦截ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.UNAUTHORIZED);return  response.setComplete();}//        TODO 5.传递用户信息String userInfo= userId.toString();
//存入上下文ServerWebExchange swe = exchange.mutate().request(builder -> builder.header("user-info", userInfo)).build();//        6.放行 传入下一层过滤器中return chain.filter(swe);}//工具方法,用来判断是否包含在公共开放的路径中private boolean isExclude(String path) {for (String pathPattern: authProperties.getExcludePaths()) {if (antPathMatcher.match(pathPattern,path)){return true;}}return false;}
// 设置在过滤器中的级别,数字越小,级别越高,在pre过程中先执行@Overridepublic int getOrder() {return 0;}
}

关建步骤在5,通过5将用户信息存入上下文中,然后放在请求头中。即可完成将获取用户校验信息并存入请求头中。

2 微服务获取网关中的用户校验信息(网关-微服务)

获取方法是加拦截器,加在每一个微服务中,这样就会拦截从网关路由过来的请求,然后获取请求头中的用户信息,最后放在ThreadLocal中即可共享信息

2.1 一般的做法是在公共的module中添加,此处示例为common 公共配置module中添加

2.2 定义拦截器


public class UserInfoInterceptor implements HandlerInterceptor {//重写方法@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        1.获取登陆用户信息String userInfo = request.getHeader("user-info");
//        2.判断是否获取了用户 如果有 直接存入ThreadLocalif(StrUtil.isNotBlank(userInfo)){UserContext.setUser(Long.valueOf(userInfo));}
//        3.放行return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//       业务逻辑结束清理用户信息 移除ThreadLocal中的用户信息UserContext.removeUser();return ;}
}

拦截器定义以后需要注册到spring Mvc。

2.3 定义注册类

(关于添加下面第二个注解的原因,如果不添加,默认在所有微服务中都生效,那么在启动微服务的时候,所以会自动扫描微服务中的Mvc基础配置,但在网关gateway微服务中并不是SpringMvc,因此会扫描不到而出错。添加的注解是有SpringMvc核心容器类的时候才会生效,这样就只有是SpringMvc的微服务才会生效,避免错误。)

@Configuration
@ConditionalOnClass(DispatcherServlet.class)// 添加此注解是避免在网关微服务中因扫描不到Mvc配置而出错
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {
//      registry 是注册类,调用下面的方法,添加拦截器registry.addInterceptor(new UserInfoInterceptor());}
}

像这种添加在公共包下的配置类因为不是一个spring项目,没有启动类,因此spring 默认扫描不到这个MvcConfig配置类,因此像这种公共包下的配置需要在配置文件中手动添加,如下将配置类路径添加到文件中即可被扫描到

2.4 手动添加注册配置类保证被扫描

以上情况就解决了从网关到各个微服务之间携带用户信息的问题,思路是微服务拦截网关到达的请求并获取用户信息。

3 多个微服务之间共享该信息(微服务-微服务)

思路也是添加拦截器,注意此拦截器是在加在发起请求的微服务中,拦截其发起的请求,然后将用户信息存入请求头中。因为我们使用OpenFeign,它提供了一个拦截器接口,会拦截所以请求,可以向请求头中添加信息,因此直接和Feign接口定义在一个包下。

3.1 定义请求拦截器RequestInterceptor

以下拦截器即可完成拦截发出的请求并将共享信息保存在请求头中的任务

//此处采用匿名内部类的方法,直接定义在了之前的配置类中,也可单独创建一个类
public class DefaultFeignConfig {@Beanpublic Logger.Level feignLoggerLevel(){return  Logger.Level.FULL;}//用来处理用户信息@Beanpublic RequestInterceptor userInfoRequestInterceptor(){return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate requestTemplate) {
//            获取用户信息,这是之前网关向微服务传递信息时存入了Thredlocal中的用户信息,取出Long userId = UserContext.getUser();if (userId!=null){
//            将获取到的用户信息存入请求头中requestTemplate.header("user-info",userId.toString());}}};}}

4 前端-网关-微服务-微服务间信息共享全流程

4.1 (前端-网关)首先前端发起请求,经过GlobalFilter过滤器判断是否需要登录,需要登录的话进行登录校验,完成登录校验后获取到用户信息,存入上下文中,保存到请求头中。然后由网关传向微服务中。

4.2 (网关-微服务)微服务拦截器拦截从网关发送过来的请求,从请求头中获取到用户信息后会通过ThreadLocal保存使用。

4.3 (微服务-微服务)微服务若再向其他微服务发起请求,则通过OpenFeign提供的RequestInterceptor拦截发出的请求,并进行将用户信息保存在请求头中的操作。

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

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

相关文章

简易五子棋

简介 使用Java实现简易五子棋 规则介绍 游戏使用一个标准的1515方格的棋盘&#xff0c;双方分别用黑白两种颜色的棋子进行对战。黑子先行&#xff0c;双方轮流在空棋盘的交叉点上落子&#xff0c;每人一次只能落一子。游戏的目标是让自己的五颗棋子连成一线&#xff0c;这条…

一分钟制作爆火的治愈插画,让插画来替你说出心声

超火的AI治愈插画来了&#xff0c;有趣的文字搭配上有趣的图&#xff0c;无论是发朋友圈还是发小红书&#xff0c;这效果简直无敌。 下面是我刚生成的&#xff0c;快来看看效果吧。 这个工具&#xff0c;国内可用&#xff0c;可以直接上手&#xff0c;不需要什么技术&#xff0…

C# Winform 侧边栏,切换不同页面

在项目中我们经常遇到需要在主界面上切换不同子页面的需求&#xff0c;常用做法是左侧显示子页面菜单&#xff0c;用户通过点击左侧菜单&#xff0c;实现右边子页面的展示。 实例项目实现&#xff1a; 项目左侧侧边栏实现FlowLayoutPanel使用显示不同子窗体 实例链接&#xf…

全网首发:教你如何直接用4090玩转最新开源的stablediffusion3.0

1.stablediffusion的概述&#xff1a; Stable Diffusion&#xff08;简称SD&#xff09;近期的动态确实不多&#xff0c;但最新的发展无疑令人瞩目。StableCascade、Playground V2.5和Stableforge虽然带来了一些更新&#xff0c;但它们在SD3面前似乎略显黯然。就在昨晚&#x…

04.VisionMaster 机器视觉找圆工具

VisionMaster 机器视觉找圆工具 定义 先检测出多个边缘点然后拟合成圆形&#xff0c;可用于圆的定位与测量 注意&#xff1a;找圆工具 最好和【位置修正】模块一起使用。具体可以看下面的示例。 参数说明&#xff1a; 扇环半径&#xff1a;圆环ROI的内外圆半径 边缘类型&a…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] K小姐的服务交换接口失败率分析 (100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 K小姐的服务交换接口失败率分析(100分) 🌍 评测功能需要订…

基于.Net 框架实现WebSocket 简单通信——服务端

新建项目 创建一个.Net 框架的控制台程序。 添加包 项目 → 管理 NuGet 程序包打开包管理窗口&#xff0c;添加SuperWebSocket 程序包。 实现 项目 → 添加类打开添加新项窗口&#xff0c;添加一个C#类。 启动监听 WebSocketServer socket new WebSocketServer();Conso…

【github】项目的代码仓库重命名

问题 有时候&#xff0c;我们先创建了远端项目仓库&#xff0c;然后就把相关code上传到远端项目仓库。 可能需要结合实际情况对远端项目仓库进行重命名。 当前仓库名称v_ttc&#xff0c;如何将他修改成v_datejs 操作步骤 1、在 GitHub.com 上&#xff0c;导航到存储库的主页…

(金融:货币兑换)编写一个程序,提示用户输入从美元到人民币的兑换汇率。

&#xff08;金融:货币兑换)编写一个程序&#xff0c;提示用户输入从美元到人民币的兑换汇率。提示用户输入0表示从美元兑换为人民币&#xff0c;输入1表示从人民币兑换为美元。继而提示用户输入美元数量或者人民币数量&#xff0c;分别兑换为另外一种货币。下面是运行示例: pa…

TCP/IP协议深入解析,初学者必看!

简介 在信息技术飞速发展的今天&#xff0c;网络已成为人类社会不可或缺的部分。实现网络中计算机相互通信的关键之一便是TCP/IP协议。作为互联网的基础&#xff0c;TCP/IP协议确保了全球范围内的数据交换和信息共享。 TCP/IP&#xff08;传输控制协议/网际协议&#xff09;是…

LeetCode 2813.子序列最大优雅度

给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi]&#xff0c;其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可以用 total_profit distinct_categories^2 计算&#xff0c;其中 t…

通勤路上的美好伴侣:倍思H1s头戴式蓝牙耳机

在繁忙的都市生活中,通勤往往占据了人们大量的时间。而在这个过程中,无尽的嘈杂声——公交车的播报声、地铁的轰鸣声、街头的喧嚣——往往成为我们心情的干扰源。在这样的环境下,一款优质的头戴式蓝牙耳机,会让我们的通勤之旅变得更加愉快和舒适。 通勤路上要更舒适—— 倍思…

LDR6023S:革新USB Type-C接口的完美伴侣

一、引言 随着科技的发展&#xff0c;USB Type-C接口以其高速传输、正反插等特性逐渐取代了传统的USB接口。而在这一背景下&#xff0c;LDR6023S作为一款USB Type-C转音频快充芯片&#xff0c;凭借其卓越的性能和广泛的应用场景&#xff0c;成为了市场上备受瞩目的产品。本文将…

西门子PLC位逻辑指令学习(SCL语言)

R_TRIG 参数 功能 当CLK信号出现一个低电平到高电平的跳变时&#xff0c;输出Q导通一个周期。 实例 定义以下类型变量 "R_TRIG_DB"(CLK:"data".source,Q>"data".result); //当source输入出现低电平到高电平跳变&#xff0c;result信号…

「计算机网络」初识http协议

前言 HTTP协议——互联网发展的基石&#xff0c;从一个最简单的“helloworld”网页&#xff0c;到现在博客平台、视频网站都离不开HTTP协议的存在。随着互联网的发展&#xff0c;Web网页的设计也越发复杂&#xff0c;前后端开发的分工也越发明确&#xff0c;HTTP作为连接前后端…

基于YOLO检测算法(单检测器网络+多视频输入)设计与实现

在单摄像头目标检测的基础上&#xff0c;实现单网络多线程的实时目标检测。 1&#xff0c;应用场景 在安防领域&#xff0c;YOLO的多摄像头实时目标检测应用具有以下特点和优势&#xff1a; 实时性能&#xff1a; YOLO算法以非常高的速度运行&#xff0c;能够实现实时目标检测…

力扣刷题--2843. 统计对称整数的数目【简单】

题目描述 给你两个正整数 low 和 high 。 对于一个由 2 * n 位数字组成的整数 x &#xff0c;如果其前 n 位数字之和与后 n 位数字之和相等&#xff0c;则认为这个数字是一个对称整数。 返回在 [low, high] 范围内的 对称整数的数目 。 示例 1&#xff1a; 输入&#xff1…

pytest + yaml 框架 - 65.Pycharm 设置 yaml 格式用例模板,高效写用例

前言 初学者对yaml 格式不太熟悉,自己写yaml用例的时候,总是格式对不齐,或者有些关键字会忘记。 于是我们可以在pycharm上设置用例模块,通过快捷方式调用出对应的模块,达到高效写用例的目的。 pycharm设置用例模板 File - Settings Live Templates - python 点 + 号…

扩展欧几里得算法——AcWing.877扩展欧几里得算法

扩展欧几里得算法 定义 扩展欧几里得算法是用来在已知整数 a、b 的情况下&#xff0c;求解一组整数 x、y 使得 ax by gcd(a, b)&#xff08;gcd 表示最大公约数&#xff09;。 运用情况 求解线性同余方程。在密码学等领域有广泛应用。 注意事项 要注意边界情况和特殊值…

LED显示屏色差处理方法

LED显示屏以其高亮度、低功耗和长寿命等优点&#xff0c;在广告、信息发布和舞台背景等领域得到广泛应用。然而&#xff0c;由于生产批次的不同&#xff0c;LED显示屏在亮度和色度上可能存在差异&#xff0c;影响显示效果。本文将探讨如何通过逐点校正技术来解决这一问题。 逐点…