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(); //路径匹配    
                                                                          //工具类
    @Override
    public 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.获取token
        HttpHeaders headers = request.getHeaders();
        String token = null;
        List<String> authorization = headers.get("authorization");
        if(authorization !=null && !authorization.isEmpty()){
            token = authorization.get(0);
        }

//        4.校验并解析token
        Long 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过程中先执行
    @Override
    public int getOrder() {
        return 0;
    }
}

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

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

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

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

2.2 定义拦截器


public class UserInfoInterceptor implements HandlerInterceptor {

    //重写方法
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        1.获取登陆用户信息
        String userInfo = request.getHeader("user-info");
//        2.判断是否获取了用户 如果有 直接存入ThreadLocal
        if(StrUtil.isNotBlank(userInfo)){
            UserContext.setUser(Long.valueOf(userInfo));
        }
//        3.放行
        return true;
    }

    @Override
    public 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 {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//      registry 是注册类,调用下面的方法,添加拦截器
        registry.addInterceptor(new UserInfoInterceptor());
    }
}

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

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

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

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

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

3.1 定义请求拦截器RequestInterceptor

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

//此处采用匿名内部类的方法,直接定义在了之前的配置类中,也可单独创建一个类
public class DefaultFeignConfig {
    @Bean
    public Logger.Level feignLoggerLevel(){
        return  Logger.Level.FULL;
    }

//用来处理用户信息
    @Bean
    public RequestInterceptor userInfoRequestInterceptor(){
        return new RequestInterceptor() {
            @Override
            public 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.mfbz.cn/a/698627.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是微控制器中的欠压复位?如何防止误断电

微控制器的“掉电”是指电源电压部分暂时降低到可靠运行所需的水平以下。许多微控制器都有一个保护电路&#xff0c;可以检测电源电压何时低于此水平&#xff0c;并将设备置于复位状态&#xff0c;以确保电源恢复时正确启动。此操作称为“欠压复位”或 BOR。类似的功能称为低电…

数据不归路?文件清理的后悔药,2个文件恢复技巧

手机已成为我们生活中不可或缺的重要工具&#xff0c;它不仅仅是一个通讯设备&#xff0c;更是我们存储个人信息、工作文件、照片和视频等宝贵资料的仓库。然而&#xff0c;生活中的意外总是难以预料&#xff0c;有时候我们可能会不小心删除重要的文件&#xff0c;或者因为手机…

JVS规则引擎实战:如何轻松接入本地数据库数据

在当今数据驱动的时代&#xff0c;有效地接入和利用各种数据源是企业和组织实现智能化、自动化决策的关键。JVS-RULES通过支持多种数据形态&#xff0c;为用户提供了一个统一的数据接入平台&#xff0c;使不同来源的数据能够被整合并用于规则判断。接下来我给大家详细介绍如何通…

鸿蒙轻内核M核源码分析系列二十 Newlib C

LiteOS-M内核LibC实现有2种&#xff0c;可以根据需求进行二选一&#xff0c;分别是musl libC和newlibc。本文先学习下Newlib C的实现代码。文中所涉及的源码&#xff0c;均可以在开源站点https://gitee.com/openharmony/kernel_liteos_m 获取。 使用Musl C库的时候&#xff0c…

CSS之块浮动

在盒子模型的基础上就可以对网页进行设计 不知道盒子模型的可以看前面关于盒子模型的内容 而普通的网页设计具有一定的原始规律,这个原始规律就是文档流 文档流 标签在网页二维平面内默认的一种排序方式,块级标签不管怎么设置都会占一行,而同一行不能放置两个块级标签 行级…

Ubuntu编译虚幻引擎工程

前言 最近研究了一下在ubuntu编译虚幻引擎&#xff0c;发现确实做得很好&#xff0c;编译非常简单&#xff0c;这里记录一下。 下载虚幻引擎源码 源码下载地址如下https://www.unrealengine.com/zh-CN/linux 选择合适的版本即可&#xff0c;我这里选择的是UE5.1 安装dotnet驱动…

前端JS必用工具【js-tool-big-box】学习,获取当前浏览器向上滚动还是向下滚动,获取当前距离顶部和底部的距离

这一小节&#xff0c;我们说一下 js-tool-big-box 添加的最新工具方法&#xff0c;在日常前端开发工作中&#xff0c;如果网页很长&#xff0c;我们就需要获取当前浏览器是在向上滚动&#xff0c;还是向下滚动。如果向上滚动&#xff0c;滚动到0的时候呢&#xff0c;需要做一些…

金智易表通流程设置的若干问题

1、审批节点的审批人取应用权限组&#xff0c;权限组内任一人审批即可通过 在流程节点的主要配置环节&#xff0c;选择候选组 二、已审菜单要求看到自己审过的也能看到别人审过的&#xff0c;即能看到所有已审的记录 管理设置中取消按钮对流程的依赖&#xff0c;不根据流程审批…

二叉树最大深度

leetcode- 104-二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&…

阿一网络安全学院来向你科普关于企业安全服务

一、四大服务体系 1、可管理安全服务 在提供传统安全产品及安全服务的基础上&#xff0c;逐步开展安全运营&#xff0c;用开放的安全平台连接卓越的产品和服务&#xff0c;洞察安全态势&#xff0c;为企业级用户提供小时级的闭环安全保障。 2、安全咨询服务 为客户进行全方…

苹果AI一夜颠覆所有,Siri史诗级进化,内挂GPT-4o

苹果AI一夜颠覆所有&#xff0c;Siri史诗级进化&#xff0c;内挂GPT-4o 刚刚&#xff0c;苹果AI&#xff0c;正式交卷&#xff01; 今天&#xff0c;苹果构建了一个全新AI帝国——个人化智能系统Apple Intelligence诞生&#xff0c;智能助手Siri迎来诞生13年以来的史诗级进化…

2024年【G2电站锅炉司炉】报名考试及G2电站锅炉司炉考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G2电站锅炉司炉报名考试是安全生产模拟考试一点通生成的&#xff0c;G2电站锅炉司炉证模拟考试题库是根据G2电站锅炉司炉最新版教材汇编出G2电站锅炉司炉仿真模拟考试。2024年【G2电站锅炉司炉】报名考试及G2电站锅炉…

MCU为什么上电不启动

相信很多朋友们都遇到过&#xff0c;自信满满的将程序下载到板子上&#xff0c;发现MCU居然没启动。 那这个现象可能有很多问题会导致&#xff0c;让我们来看看会有哪些原因。 1、BOOT引脚电平不对&#xff1a; 在GD32 MCU上&#xff0c;BOOT引脚决定了MCU的启动方式&#x…

Elastic Search 8.14:更快且更具成本效益的向量搜索,使用 retrievers 和重新排序提升相关性,RAG 和开发工具

作者&#xff1a;来自 Elastic Yaru Lin, Ranjana Devaji 我们致力于突破搜索开发的界限&#xff0c;并专注于为搜索构建者提供强大的工具。通过我们的最新更新&#xff0c;Elastic 对于处理以向量表示的大量数据的客户来说变得更加强大。这些增强功能保证了更快的速度、降低的…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:AI智能监控 用于沙滩救援

以色列的一个团队在人工智能领域取得的成果引起了轰动。 今天他们取得的成果源于多年前的一个想法。Netanel Eliav 和 Adam Bismut 是校园时代的旧伙伴&#xff0c;当时他们想要解决一个可以改变世界的问题&#xff0c;由此引出这样一个想法&#xff1a;溺水的 Bismut 漂流到死…

【CT】LeetCode手撕—25. K 个一组翻转链表

目录 题目1-思路2- 实现⭐25. K 个一组翻转链表——题解思路 3- ACM实现 题目 原题连接&#xff1a;25. K 个一组翻转链表 1-思路 1. dummyHead&#xff1a;设置虚拟头结点&#xff0c;通过虚拟头结点保证每个结点的地位相同2. 定位 pre 和 end 拆链&#xff1a;借助 pre 、s…

419. 甲板上的战舰

题目 给你一个大小为 m x n 的矩阵 board 表示甲板&#xff0c;其中&#xff0c;每个单元格可以是一艘战舰 ‘X’ 或者是一个空位 ‘.’ &#xff0c;返回在甲板 board 上放置的战舰的数量。 战舰只能水平或者垂直放置在 board 上。换句话说&#xff0c;战舰只能按 1 x k&…

弘君资本:光刻机、存储芯片概念拉升 同益股份、上海贝岭等涨停

光刻机概念11日盘中再度走强&#xff0c;到发稿&#xff0c;双乐股份、同益股份、东方嘉盛、盛剑环境等涨停&#xff0c;飞凯资料涨近10%&#xff0c;南大光电涨超7%。 存储芯片概念亦拉升&#xff0c;到发稿&#xff0c;雅创电子涨超12%&#xff0c;万润科技、上海贝岭、好上…

何为屎山代码?

在编程界&#xff0c;有一种代码被称为"屎山代码"。这并非指某种编程语言或方法&#xff0c;而是对那些庞大而复杂的项目的一种形象称呼。屎山代码&#xff0c;也被称为"祖传代码"&#xff0c;是历史遗留问题&#xff0c;是前人留给我们的"宝藏"…

FL Studio21.2.8最新永久破解安装包下载,音乐创作神器免费下载

大家好&#xff01;今天我要和大家分享一个超棒的音乐制作软件——FL Studio21永久免费破解中文版下载&#xff01;&#x1f929; 作为一名音乐爱好者&#xff0c;我一直在寻找一款功能强大、操作简单的音乐制作工具。而FL Studio21正是我梦寐以求的宝藏&#xff01;&#x1f3…