Gateway一个诡异问题处理过程

这篇具有很好参考价值的文章主要介绍了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的负载均衡配置

Gateway一个诡异问题处理过程,Java技术,gateway

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

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

网关过滤器中代码如下:

Gateway一个诡异问题处理过程,Java技术,gateway

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

1、subject.login 机制

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

Gateway一个诡异问题处理过程,Java技术,gateway

2、Session失效机制

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

Gateway一个诡异问题处理过程,Java技术,gateway

3、拦截器中subject对象观察

Gateway一个诡异问题处理过程,Java技术,gateway

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

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

Gateway一个诡异问题处理过程,Java技术,gateway

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

到了这里,关于Gateway一个诡异问题处理过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】SpringCloud Gateway自定义过滤器中获取ServerHttpRequest的body中的数据为NULL的问题

    这个情况出现在,我需要进行验证码的校验,因此用户的请求首先需要被验证码过滤器校验,而验证码过滤器不需要设定为全局过滤器,因此我就单纯的把它设定为了一个局部过滤器,代码如下 然后我进行请求的时候,json参数如下 然后请求经过解析后会发现,字符串居然是

    2024年02月09日
    浏览(51)
  • 【SpringCloud技术专题】「Gateway网关系列」(2)微服务网关服务的Gateway功能配置指南分析

    Spring Cloud Gateway简介 Spring Cloud Gateway是Spring Cloud体系的第二代网关组件,基于Spring 5.0的新特性WebFlux进行开发,底层网络通信框架使用的是Netty,所以其吞吐量高、性能强劲,未来将会取代第一代的网关组件Zuul。 Spring Cloud Gateway可以通过服务发现组件自动转发请求,默认集成了

    2024年02月11日
    浏览(35)
  • 【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析

    为什么要有服务网关? 我们都知道在微服务架构中,系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?难道要一个个的去调用吗?很显然这是不太实际的,我们需要有一个统一的接口与这些微服务打交道,这就是我们需要服务网关的原因。 我们

    2024年02月11日
    浏览(45)
  • 微服务技术栈-Gateway服务网关

    在之前的文章中我们已经介绍了微服务技术中eureka、nacos、ribbon、Feign这几个组件,接下来将介绍另外一个组件SpringCloud-Gateway,Gateway网关是我们服务的守门神,所有微服务的统一入口。 试着思考一下,我们后台的微服务是任何人都可以访问的吗?是否每个用户都有资格访问某

    2024年02月07日
    浏览(38)
  • Gateway全局异常处理及请求响应监控

    我们在上一篇文章基于压测进行Feign调优完成的服务间调用的性能调优,此时我们也关注到一个问题,如果我们统一从网关调用服务,但是网关因为某些原因报错或者没有找到服务怎么办呢? 如下所示,笔者通过网关调用 account 服务,但是 account 服务还没起来。此时请求还没

    2024年02月04日
    浏览(46)
  • 502 bad gateway什么意思502 bad gateway问题解决办法

    502 bad gateway 是一种常见互联网连接错误,大部分情况就是打不开页面,连接不上网络,访问服务器挂了等问题,下面来看看具体解决方法,希望能够帮助你解决问题。 502 bad gateway什么意思 简单说就是服务器没有收到回应,一般情况下是对方服务器出了问题。 502 bad gatewa

    2024年02月11日
    浏览(39)
  • 【微服务网关---Gateway 的全局异常处理器】

    Gateway网关统一全局异常处理操作 方便前端看到 这里要精细化翻译,默认返回用户是看不懂的 所以需要配置一个 Gateway 的全局异常处理器 如果没有网关全局异常的 会如下截图 代码如下: 代码如下: 代码如下: 以上就是今天要讲的内容,本文仅仅简单 所以需要配置一个

    2024年02月12日
    浏览(39)
  • 【SpringCloud】微服务技术栈入门3 - Gateway快速上手

    WebFlux gateway 基于 webflux 构建 WebFlux 是基于反应式流概念的响应式编程框架,用于构建异步非阻塞的 Web 应用程序。它支持响应式编程范式,并提供了一种响应式的方式来处理 Web 请求。 与传统的 Servlet API 相比,WebFlux 采用了基于事件驱动的编程模型,不依赖于传统的线程池模

    2024年02月07日
    浏览(39)
  • gateway跨域问题

    在使用gateway做网关过程中配置跨域配置: 运行之后在控制台发现错误:  xxx has been blocked by CORS policy: No \\\'Access-Control-Allow-Origin\\\' header is present on the request resouce. 需要去掉: corsConfiguration.addAllowedOriginPattern(\\\"*\\\");   去掉之后问题解决。

    2024年02月13日
    浏览(32)
  • 解决gateway跨域问题

    只要与当前浏览器访问的url不同(协议,域名,端口号),就会产生跨域。 1. 配置文件解决,在gateway的配置文件中 注:要加上最下边的配置,不然浏览器还是会报跨域问题,因为浏览器 Vary  和  Access-Control-Allow-Origin  两个头重复了两次,其中浏览器对后者有唯一性限制!

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包