当前位置: 首页 > article >正文

记录一次网关异常

记一次网关异常

  • 网关时不时就会出现下面的异常。关键是不知道什么时候就会报错,并且有时候就算什么都不操作,也会导致这个异常。
 ERROR org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
	at java.util.ArrayList.rangeCheck(ArrayList.java:657)
	at java.util.ArrayList.get(ArrayList.java:433)
	at org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator.combinePredicates(RouteDefinitionRouteLocator.java:238)
	at org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator.convertToRoute(RouteDefinitionRouteLocator.java:162)
	at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:100)
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:693)
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmit(FluxFlatMap.java:553)
	at reactor.core.publisher.FluxFlatMap$FlatMapInner.onNext(FluxFlatMap.java:972)
	at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:114)
	at reactor.core.publisher.FluxSubscribeOnValue$ScheduledScalar.run(FluxSubscribeOnValue.java:178)
	at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
	at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
·	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

  • 经过搜索,说是gateway低代码版本的漏洞,然后解决方案是,使用nginx拦截actuator方法。
location /actuator {
  return 404;
}

虽然看着很简单,但是不了解实际原因,真的不敢随便这种升级,因为不确定这个方案到底有没有解决问题。一旦这种升级没有用,生产环境在产生同样的异常,就会给用户造成非常不要的影响,并且会让用户觉得我们不可信,所以还是要探求真正的原因。

  • 之后,便从github的gateway官网上,找到了这个issue,看下面的讨论,发现是缺少Predicted的路由导致的。当路断言未空的时候,实际上是无法进行路由创建的,如果没有为空的判断,就会导致整个路由表崩溃,从而所有请求都报 500。下面是修正后的代码,就是当断言为空的时候,直接放行就行了。

image-20241203221027457

  • 然后,结合动态路由增删的这篇文章,我进行了本地代码的复现

    • 首先定义动态增删路由的接口,见上面的文章。

    • 其次发送post请求,增加一个接口,但是路由的断言不进行创建。也就是发送下面错误的请求体

      post:localhost:8080/actuator/gateway/routes/demo2
      
      // 错误的请求体,但是实际上,接受参数的时候,是没有进行验证的。
      {
      "id": "demo2",
      "uri": "http://fuzekun.top3/"
      }
      // 完整的请求体
      {
      "id": "demo3",
      "uri": "http://fuzekun.top3/",
      "predicates": [
      {
      "name": "Path",
      "args": {
      "pattern": "/blog3/**"
      }
      }
      ]
      }
      
      
    • 最后发送refresh路由表的请求post: localhost:8080/actuator/gateway/refresh,就会得到上面的错误。

  • 最后,通过升级springcloud gateway的版本,在重复上面的操作,可以发现,路由表仍旧是可以工作的。

最后最后,附上版本的对应表,项目报错使用的版本为

  • spring cloud dependencies :Hoxton.SR2
  • spring cloud alibaba : 2.2.0.RELEASE

修改后的版本为:

  • Spring Cloud Dependencies :Hoxton.SR9
  • spring cloud alibaba : 2.2.6.RELEASE

http://www.kler.cn/a/421479.html

相关文章:

  • 网络安全框架及模型-PPDR模型
  • JavaScript(JS)的对象
  • Zustand的学习和应用
  • SpringBoot集成Kafka和avro和Schema注册表
  • vue2+svg+elementui实现花瓣图自定义el-select回显色卡图片
  • [Redis#13] cpp-redis接口 | set | hash |zset
  • 配置宝塔php curl 支持http/2 发送苹果apns消息推送
  • 基于单片机设计了居家智能音箱系统(论文+源码)
  • Java面试要点50 - List的线程安全实现:CopyOnWriteArrayList
  • @staticmethod、@classmethod
  • 什么是前端构建工具?比如(Vue2的webpack,Vue3的Vite)
  • echarts地图立体效果,echarts地图点击事件,echarts地图自定义自定义tooltip
  • 工程设计行业内外网文件交换解决方案:FileLink助力高效、安全的跨网协作
  • Linux网络编程之---多线程实现并发服务器
  • 【北京迅为】iTOP-4412全能版使用手册-第三十二章 网络通信-TCP套字节
  • 嵌入式蓝桥杯学习1 点亮LED
  • LabVIEW 队列消息处理器设计
  • 云计算介绍_02(虚拟化、虚拟化类型、虚拟化层架构、容器)
  • 鸿蒙多线程开发——Sendable使用注意事项
  • 【docker】docker compose多容器部署
  • Rain后台权限管理系统,快速开发
  • 我的知识图谱和Neo4j数据库的使用
  • AI×5G 市场前瞻及应用现状
  • 深入探索 HarmonyOS 的 Navigation 组件:灵活的页面管理与动态导航
  • win10-Docker打不开this can prevent Docker from starting. Use at your own risk.
  • 【C++】LeetCode:LCR 022. 环形链表 II