Gateway一个诡异问题处理过程

一、前言

我们搭好了网关和一个基础微服务(含用户体系、门店服务、商品服务、客户服务),然后用APIfox测试过程中发现通过网关入口请求某些接口,一段时间后返回错误,查看系统日志发现除了报There is no session with id [f810df9f-74c4-4f26-a742-e770808acd38],没有其它任何异常,因为这个类似错误在以前系统里也有报,但不影响正常使用,直观认定这个不是造成问题的原因,然后进行了一系列排查(骚操作)。

二、排查过程

权限机制:我们在网关统一做认证和鉴权,简单讲就是在每个微服务中使用Spring的工具类将路径和Shiro注解解析出来然后注册到Redis中,网关这边根据请求路径及权限要求与当前用户所拥有的权限进行校对。

1、怀疑namespace配置问题

我们采用了namesapce进行环境隔离,见《SpringCloud Nacos环境隔离》,认为可能是namespace配置不合理造成网关无法访问基础微服务,将namespace配置移除,gateway重启后,一段时间后问题又出现。

2、怀疑Nacos的负载均衡配置

但因为我们测试环境,微服务是单机并不是集群部署的,怀疑单机配置了这个负载均衡造成无法访问,移除掉代码,重启服务,一段时间后问题又出现。

3、怀疑内存问题

虽然在日志中没有发现OOM,但观察到gc日志在40分钟左右heap会升到300多M,然后GC也比较频繁(YGC),怀疑是我们网关中一个定时任务(每隔15秒从Redis中注册的权限(路径+权限标识)同步到本地Map)占用了大量资源,这个定时任务在我们应用场景中必要性并不大,属于过度设计了,先摘掉再说,YGC频度降下来了,但问题依旧。

4、怀疑Gateway被攻击

Gateway低版本存在被攻击的可能性,查看日志发现没有攻击相关日志,并且我们还在测试环境,理论上被攻击的概率还是较低的。

5、重新定位问题

接口测试操作流程:在APIfox中先用账号A登录,返回了token,然后用token去请求其它接口,开始是正常的,一段时间后接口请求不通。让测试在测试不通的时候换另外一个账号B登录,然后用B的token去请求接口,正常。这时又重新怀疑是Shiro的问题,并且报错信息中有shiro报错信息There is no session with id。严重怀疑有shiro的session机制有关,那就有必要先了解一下Shiro Session机制。

三、网关中Shiro session

网关过滤器中代码如下:

注:每次拦截时都进行了一次subject.login,这本身并不合理,Review代码的时候我关注到了,但觉得问题不大,没较真,正常应该是在登录代码里进行subject.login,这里暂且先不管它。

1、subject.login 机制

它会去创建Shiro的Session,并且生成一个UUID型的SessionID.内部序列图如下

2、Session失效机制

每次调用subject.login都会重新生成一个Session(SessionId不同),Shiro默认Session失效是30分钟,这与我们开始应用重启过个几十分钟状况吻合,自己可以调整设置,为了重现问题,我将其调整为1秒。

3、拦截器中subject对象观察

两次请求拦截器是线程是复用的(这是gateway的WebFlux机制,需要深入学习一下),然后通过代码

SecurityUtils.getSubject()获取当前主体,这个是从ThreadLocal中获取。

这样主体subject一直没变但Session已经变更了,去验证的时候就会报SessionID不存在,这里最简单的处理方案是在后面再加上一行代码,验证通过后直接将主体销毁。我们做微服务主要的用户是收银台,但收银台账号不需要走Shiro这套机制,后台管理人员需要Shiro鉴权但这个访问量很小,每次请求都走一下Shiro登录,然后验证权限,最后Shiro登出问题也不大。

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

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

相关文章

流程封装与基于加密接口的测试用例设计

接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法,是远远不够的,还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以,接下来,我们主要介绍下接口测试用例分析以及通用的流程封装是如何…

并发编程 -常用并发设计模式

1. 优雅终止线程的设计模式 思考:在一个线程 T1 中如何优雅的终止线程 T2? 错误思路1:使用线程对象的 stop() 方法停止线程 stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释 …

postgresql的windows

1. 资源下载: https://www.postgresql.org/download/windows/ 2. 安装 双击,指定D盘目录,接下来默认安装,一直到出现下面的最后一步。一定要去除勾选复选框。 在最后,点击FINISH。 3. 初始化 4. 检查和修改配置 1&am…

数据结构:优先级队列(堆)

概念 优先级队列是啥? 队列是一种先进先出 (FIFO) 的数据结构 ,但有些情况下, 操作的数据可能带有优先级,一般出队 列时,可能需要优先级高的元素先出队列。 在这种情况下, 数据结构应该提供两个最基本的…

converted from warning

converted from warning 关注微信:生信小博士 本地或者其它服务器跑同样的代码是正常的,只是有警告,但是在西柚云服务器上面运行会报错? 这是由于您两个环境使用的包版本不一样导致的,有如下解决方法 或者之前只是告警…

Jetpack Compose | State状态管理及界面刷新

我们知道Jetpack Compose(以下简称Compose)中的 UI 可组合项是通过Composable 声明的函数来描述的,如: Composable fun Greeting() {Text(text "init",color Color.Red,modifier Modifier.fillMaxWidth()) }上面的代…

MySQL实战1

文章目录 主要内容一.墨西哥和美国第三高峰1.准备工作代码如下(示例): 2.目标3.实现代码如下(示例): 4.相似例子代码如下(示例): 二.用latest_event查找当前打开的页数1.准备工作代码如下(示例&…

C++设计模式_20_Composite 组合模式

Composite 组合模式和后面谈到的Iterator,Chain of Resposibility都属于“数据结构”模式。Composite 组合模式核心是通过多态的递归调用解耦内部和外部的依赖关系。 文章目录 1. “数据结构”模式1.1 典型模式 2. 动机( Motivation )3. 模式定义4. Composite 组合模…

科普|电源自动测试系统测试的项目都有哪些?

电源自动测试系统是一种用于电源性能自动测试的集成系统,它可以自动检测电源模块或开关电源的输入、输出、保护等各个方面。该系统通常由数据软件和各类硬件测试仪器共同组成,利用通讯总线、测试夹具以及其它线缆等将仪器进行连接组成整体的系统结构&…

day14_集合

今日内容 零、 复习昨日 一、集合框架体系 二、Collection 三、泛型 四、迭代 五、List(ArrayList、LinkedList) 零、 复习 throw和throws什么区别 throwthrows位置方法里面方法签名上怎么写throw 异常对象throws异常类名(多个)作用真正抛出异常对象声明抛出的异常类型 运行时…

成本预算管理系统

成本预算管理系统 功能介绍: 一 基本信息: 1、产品设置:产品的长、宽、高及面积计算公式的设置。 2、板材设置:板材类别、厚度、尺寸的设置 3、系统名称:风管系统的类别设置 4、公司信息:本公司的信息…

【多线程】线程互斥 {竞态条件,互斥锁的基本用法,pthread_mutex系列函数,互斥锁的原理;死锁;可重入函数和线程安全}

一、进程线程间通信的相关概念 临界资源:多线程执行流共享的资源就叫做临界资源。确切的说,临界资源在同一时刻只能被一个执行流访问。临界区:每个线程内部,访问临界资源的代码,就叫做临界区。互斥:通过互…

基于鸟群算法的无人机航迹规划-附代码

基于鸟群算法的无人机航迹规划 文章目录 基于鸟群算法的无人机航迹规划1.鸟群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用鸟群算法来优化无人机航迹规划。 1.鸟群搜索算法 …

0基础学习PyFlink——用户自定义函数之UDF

大纲 标量函数入参并非表中一行(Row)入参是表中一行(Row)alias PyFlink中关于用户定义方法有: UDF:用户自定义函数。UDTF:用户自定义表值函数。UDAF:用户自定义聚合函数。UDTAF&…

vue2+ant-design-vue a-select组件二次封装(支持单选/多选添加全选/分页(多选跨页选中)/自定义label)

一、效果图 二、参数配置 1、代码示例 <t-antd-selectv-model"selectVlaue":optionSource"stepList"change"selectChange" />2、配置参数&#xff08;Attributes&#xff09;继承 a-select Attributes 参数说明类型默认值v-model绑定值…

vivado crash

将增量编译去了

FPGA时序分析与约束(9)——主时钟约束

一、时序约束 时序引擎能够正确分析4种时序路径的前提是&#xff0c;用户已经进行了正确的时序约束。时序约束本质上就是告知时序引擎一些进行时序分析所必要的信息&#xff0c;这些信息只能由用户主动告知&#xff0c;时序引擎对有些信息可以自动推断&#xff0c;但是推断得到…

Sprint Cloud Stream整合RocketMq和websocket实现消息发布订阅

1.引入RocketMQ依赖&#xff1a;首先&#xff0c;在pom.xml文件中添加RocketMQ的依赖&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</versi…

文件改名,轻松添加前缀顺序编号,文件改名更高效!

您是否曾经需要批量修改文件名&#xff0c;并希望在文件名中添加特定的前缀或顺序编号&#xff1f;现在&#xff0c;我们为您带来了一款全新的文件改名工具&#xff0c;帮助您轻松解决这个问题&#xff01; 第一步&#xff0c;进入文件批量改名高手主页面&#xff0c;在板块栏…

C++学习笔记之四(标准库、标准模板库、vector类)

C 1、C标准库2、C标准模板库2.1、vector2.1.1、vector与array2.1.2、vector与函数对象2.1.3、vector与迭代器2.1.4、vector与算法 1、C标准库 C C C标准库指的是标准程序库( S t a n d a r d Standard Standard L i b a r a y Libaray Libaray)&#xff0c;它定义了十个大类…