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

news2024/11/15 10:26:35

目录

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.coloradmin.cn/o/1813728.html

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

相关文章

C++|哈希结构封装unordered_set和unordered_map

上一篇章&#xff0c;学习了unordered系列容器的使用&#xff0c;以及哈希结构&#xff0c;那么这一篇章将通过哈希结构来封装unordered系列容器&#xff0c;来进一步的学习他们的使用以及理解为何是如此使用。其实&#xff0c;哈希表的封装方式和红黑树的封装方式形式上是差不…

鸿蒙低代码开发的局限性

在版本是DevEco Studio 3.1.1 Release&#xff0c;SDK是3.1.0(API9) 的基础上。 1、低代码插件没有WebView组件。 2、低代码插件没有空白的自定义组件&#xff0c;当前提供的所谓自定义组件&#xff0c;只能用列表中提供的组件来拼接新的组件。 3、使用ets代码自定义的组件&…

JVM 常量池汇总

Tips JVM常量池分为静态常量池和运行时常量池&#xff0c;因为Jdk1.7后字符串常量池从运行时常量池存储位置剥离&#xff0c;故很多博客也是区分开来&#xff0c;存储位置和内容注意区别&#xff01; 字符串常量池底层是由C实现&#xff0c;是一个类似于HashTable的数据结构&am…

Spring 中使用MyBatis

一、Mybatis 的作用 1、MyBatis&#xff08;前身为iBatis&#xff09;是一个开源的Java持久层框架&#xff0c;它主要用于与数据库交互&#xff0c;帮助开发者更轻松地进行数据库操作。 持久层&#xff1a;指的是就是数据访问层(dao)&#xff0c;是用来操作数据库的。 2、MyB…

Filament 【表单操作】修改密码

场景描述&#xff1a; 新增管理员信息时需要填写密码&#xff0c;修改管理员信息时密码可以为空&#xff08;不修改密码&#xff09;&#xff0c;此时表单中密码输入有冲突&#xff0c;需要对表单中密码字段进项条件性的判断&#xff0c;使字段在 create 操作时为必需填写&…

深度学习-注意力机制和分数

深度学习-注意力机制 注意力机制定义与起源原理与特点分类应用领域实现方式优点注意力机制的变体总结注意力分数定义计算方式注意力分数的作用注意力分数的设计总结 注意力机制&#xff08;Attention Mechanism&#xff09;是一个源自对人类视觉研究的概念&#xff0c;现已广泛…

实测 WordPress 最佳优化方案:WP Super Cache+Memcached+CDN

说起 WordPress 优化加速来可以说是个经久不衰的话题了&#xff0c;包括明月自己都撰写发表了不少相关的文章。基本上到现在为止明月的 WordPress 优化方案已经固定成型了&#xff0c;那就是 WP Super CacheMemcachedCDN 的方案&#xff0c;因为这个方案可以做到免费、稳定、安…

如何用R语言ggplot2画高水平期刊散点图

文章目录 前言一、数据集二、ggplot2画图1、全部代码2、细节拆分1&#xff09;导包2&#xff09;创建图形对象3&#xff09;主题设置4&#xff09;轴设置5&#xff09;图例设置6&#xff09;散点颜色7&#xff09;保存图片 前言 一、数据集 数据下载链接见文章顶部 处理前的数据…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP6S26(SPI接口)的6通道模拟可编程增益放大器Proteus仿真

一、简介: MCP6S26是模拟可 编程增益放大器(Programmable Gain Amplifiers, PGA)。它们可配置为输出 +1 V/V 到 +32 V/V 之间的增 益,输入复用器可通过 SPI 端口选择最多 6 个通道中的 一个。串行接口也可以将 PGA 置为关断模式,以降低 功耗。这些 PGA 针对高速度、低失调…

Python编程基础5

邮件编程 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;简单邮件传输协议&#xff0c;使用TCP协议25端口&#xff0c;它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。python的smtplib提供了一种很方便的途径发送电子邮件。…

【python】tkinter GUI开发: Button和Entry的应用实战探索

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

MySQL----排序ORDER BY

在对数据进行处理的时候&#xff0c;我们通常需要对读取的数据进行排序。而 MySQL 的也提供了 ORDER BY 语句来满足我们的排序要求。 ORDER BY 可以按照一个或多个列的值进行升序&#xff08;ASC&#xff09;或降序&#xff08;DESC&#xff09;排序。 语法 SELECT column1…

航班进出港管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;航班信息管理&#xff0c;航飞降落请求管理&#xff0c;公告信息管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告信息&a…

中国新兴的数字证书品牌——JoySSL

JoySSL是一个基于全球可信顶级根创新推出的新一代https数字证书&#xff0c;也是中国为数不多的自主品牌SSL证书。以下是关于JoySSL的详细介绍&#xff1a; 1 品牌背景&#xff1a; JoySSL是网盾安全旗下的产品&#xff0c;专注于网络安全技术服务、安全防护系统集成、数据安…

计算机网络知识CIDR(无类别域区间路由)

目录 介绍 基本信息 优点与关联 如何计算判定范围&#xff08;你应该是来看这个的&#xff0c;前面是水字数的&#xff09; 省流版 介绍 无类别域间路由&#xff08;Classless Inter-Domain Routing、CIDR&#xff09;是一个用于给用户分配IP地址以及在互联网上有效地路由…

【SkiaSharp绘图】01使用SkiaSharp绘制Hello World

文章目录 SkiaSharp简介主要特点适用场景 SkiaSharp的Hello World!1、创建一个.NET Framework项目2、拖入SKGLControl控件GLControl、SKControl、SKGLControl对比GLControlSKControlSKGLControl选择和使用场景高性能的选择 SKGLControl 3、绘制Hello World 为何选择SkiaSharpIm…

绘唐科技官网

绘唐科技AI工具是一系列经过训练的人工智能工具&#xff0c;旨在提供各种智能化的解决方案。这些工具可以应用于多个领域&#xff0c;包括自然语言处理、图像识别、语音识别、机器学习等。 其中&#xff0c;自然语言处理工具可以帮助用户处理和理解文本数据。它可以实现文本分类…

150W无感功率电阻器

特点&#xff1a;1x150 W/2x60 W/3x33 W功率 SOT-227模具封装两种不同的端子选项 可供选择良好的机械可靠性 无感设计 电阻值&#xff1a;0.5Ω≤ 1MΩ 耐抗精度:1%- 10 % 温度系数:50 ppm/℃- 250 ppm/℃(25℃-105℃&#xff09; 额定功率:150W 70℃ bottom case tempe…

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码&#xff0c;喜欢的朋友可以下载研究 一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

8-1RT-Thread消息队列

8-1RT-Thread消息队列 消息队列又称队列&#xff0c;是一种常用于线程间通信的数据结构。 消息队列控制块里有两个链表&#xff0c;空闲列表用来挂接空的小几块&#xff0c;另一个链表是用来挂接存有消息的消息框。其中消息链表头指向消息队列当中的第一个消息框&#xff0c;而…