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,一经查实,立即删除!

相关文章

(Java)泛型总结

泛型类 public class Student<E> {private E a;public Student(E a){this.aa;}public void show(){System.out.println(a);} } 泛型方法 public <E> void show(E a){System.out.println(a);} 泛型接口 public interface Inter <T>{void show(T a); } 类…

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

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

USACO12OPEN Balanced Cow Subsets G(meet in the middle)

洛谷P3067 [USACO12OPEN] Balanced Cow Subsets G 题目大意 我们定义一个奶牛集合 S S S是平衡的&#xff0c;当且仅当满足以下两个条件&#xff1a; S S S非空 S S S可以被划分为两个集合 A , B A,B A,B&#xff0c;满足 A A A里的奶牛产量之和等于 B B B里的牛奶产量之和 …

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

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

记一些oracle的踩坑记录

这里写自定义目录标题 concat只能拼接2个参数批量插入时&#xff0c; ORA-00926: 缺失 VALUES 关键字 concat只能拼接2个参数 公司脚手架拉下来的有拼接三个参数的&#xff0c;如concat("%", #{keyowrd}, "%)执行到相关语句会报错。需要写成concat(concat(&quo…

Python selenium元素的定位

视频版教程&#xff1a;一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium 对象的定位应该是自动化测试的核心&#xff0c;要想操作一个对象&#xff0c;首先应该识别这个对象。一个对象就是一个人一样&#xff0c;他 会有各种的特征&#xff08;属性&…

go语言写的在线oj系统

1、持续更新。。。。大家等我写完

postgresql的windows

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

ADC芯片的分辨率一定等于测量精度吗?

开发充气泵方案或者电子秤方案ADC芯片都是我们必不可少的&#xff0c;其功能中的分辨率是芯片的重要一个功能&#xff0c;所谓分辨率就是最小能够分辨的模拟电压值。但常常会困扰到工程师的是&#xff0c;分辨率一定等于测量精度吗&#xff1f;市面上12位分辨率的数据采集卡的精…

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

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

converted from warning

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

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

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

MySQL实战1

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

Windows 操作系统提供的函数SetEvent以及ResetEvent,用于操作事件对象。它们属于同步原语函数,用于实现线程同步和互斥

文章目录 前言1、ResetEvent2、SetEvent3、WaitForSingleObject4、WaitForMultipleObjects 前言 SetEvent 和 ResetEvent 是 Windows 操作系统提供的函数&#xff0c;用于操作事件对象。它们属于同步原语函数&#xff0c;用于实现线程同步和互斥。这些函数的类型如下&#xff1…

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

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

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

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

【esp32]VSCode-SPI控制OLED

根据Adafruit_GFX第三方库&#xff0c;其drawPixel方法由子类实现 代码&#xff1a;在OLED实现函数功能 先声明类 SPI库和Adafruit库、SSD1306 #include <Arduino.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> …

省钱兄共享娱乐室无人系统软硬件结合是怎样开发的

随着科技的快速发展&#xff0c;共享经济模式逐渐渗透到各个领域。在娱乐室领域&#xff0c;省钱兄共享娱乐室无人系统软硬件结合的开发应运而生&#xff0c;旨在提供高效、安全、经济的娱乐室使用体验。本文将从需求分析、系统设计、软件开发和系统测试四个方面&#xff0c;详…

CentOS7安装playwright终极指南

CentOS7安装playwright终极指南 系统环境为CentOS Linux release 7.9.2009 (Core) 最小安装&#xff0c;考虑到playwright的安装需要 python3.7 &#xff0c;本次直接选择安装python3.8。 升级libstdc cd /opt yum -y install wgetwget http://www.vuln.cn/wp-content/uploa…

day14_集合

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