Spring cloud网关gateway代理websocket报io.netty.handler.codec.http.websocketx.CorruptedWebSocketFrameException Max frame length of 65536 has been exceeded

  • 一、错误结果如下:
  • 二、解决方式:
    • 1.拷代码到springboot中
    • 2.修改关于包大小的业务逻辑
  • 三、重启springboot即可生效
  • 四、延伸:为什么优先读取springboot中修改后的源码?

使用spring cloud代理websocket后,默认的包大小是64Kb,如果传比较大的图片或其他数据时会报Spring cloud网关gateway代理websocket报io.netty.handler.codec.http.websocketx.CorruptedWebSocketFrameException Max frame length of 65536 has been exceeded错误,此记录
解决问题的过程。

一、错误结果如下:

2022-02-21 17:00:46,701 WARN [reactor-http-nio-14] reactor.netty.channel.FluxReceive.warn:294 - [id: 0x8f99a4bf, L:0.0.0.0/0.0.0.0:51471 ! R:/127.0.0.1:8081] An exception has been observed post termination, use DEBUG level to see the full stack: io.netty.handler.codec.http.websocketx.CorruptedWebSocketFrameException: Max frame length of 65536 has been exceeded.

二、解决方式:

先是通过这篇文章:https://www.freesion.com/article/2527480206/了解到了大概的问题是由于message超出了netty websocket限制的最大帧长度的原因,另外也给出了自己写个class继承ReactorNettyWebSocketClient然后做一系列的操作,但看下来还是觉得太麻烦了,又要排除Gateway配置,又要引入其他的东西等,因此放弃。

但这也给了解决的思路,即然ReactorNettyWebSocketClient源码中有关于包大小的代码,那就直接在这个类的代码复制出来,放在springboot工程中,然后修改重启即可。

我使用的springboot版本:2.3.12.RELEASE,其他版本的代码可能有点不同,但都可以类似原理修改

1.拷代码到springboot中

org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient代码位置:spring-webflux-5.2.15.RELEASE.jar中,如下图

将org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient的代码直接同路径和包名拷到springboot工程中,如:

2.修改关于包大小的业务逻辑

修改改很简单,直接在ReactorNettyWebSocketClient的成员变量改即可。
修改前:

private int maxFramePayloadLength = NettyWebSocketSessionSupport.DEFAULT_FRAME_MAX_SIZE;

修改后:

private int maxFramePayloadLength = 64 * 1024 * 1024 ; //64MB


maxFramePayloadLength变量主要是在execute中用到的,如下,springboot版本不同,方法可能有些细小差别

三、重启springboot即可生效

重启springboot生效

四、延伸:为什么优先读取springboot中修改后的源码?

修改后的源码ReactorNettyWebSocketClient是和我们的应用代码在一起的,因此通过springboot打包后,会在BOOT-INF/classes中。

而其他的第三方jar会在classpath.idx中。

类在springboot打包的jar中查找的顺序为:先在BOOT-INF/classes中查询,如果找到就返回,找不到继续按在classpath.idx中列出的jar包顺序进行查找
因为我们改之后的源码在BOOT-INF/classes中,因为会优先生效,起到了覆盖原来的代码的效果

我们也可通过org.springframework.boot.loader.JarLauncher进行代码调试跟踪,在执行到ExecutableArchiveLauncher的createClassLoader方法时,会依次读取springboot打包后的jar文件,把里面的信息解析出来放urls中,并作为org.springframework.boot.loader.LaunchedURLClassLoader类的构造参数。
在程序运行中需要加载类的时候,就以urls中列出的目录或jar集合顺序进行类的查询。

从上面看,也进一步验证了springboot加载类时是优先加载BOOT-INF/classes的。

Spring cloud网关gateway代理websocket报Max frame length of 65536 has been exceeded相关推荐

  1. 解决gateway转发websocket出现Max frame length of 65536 has been exceeded

    项目版本: gateway:3.0.2 springboot:2.4.6 背景: 对接阿里云tts,gateway转发websocket请求,在字节流超过65536时,连接自动断开,跟踪源码发现,We ...

  2. netty : Max frame length of 65536 has been exceeded.

    文章目录 1. 背景 解决 1. 背景 netty刚刚学的,一个聊天室程序 界面如下: 代码如下: package com.myself.nettychat.config;

  3. Spring Cloud 的 Gateway 服务启动报错

    Spring Cloud 的 Gateway 启动报错 1.控制台错误 2.报错时主要代码配置 2.1 pom 文件 2.2 启动类 2.3 application.yml 文件 3.解决办法 1.控 ...

  4. Spring Cloud入门-Gateway服务网关(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 Gateway 简介 相关概念 创建 api-gateway模块 在pom.xml中添加相关依赖 两种不同的配置路由方式 使用yml配置 使用Ja ...

  5. Spring Cloud :Gateway 网关限流(五)

    目录 一.概述 1. 为什么需要限流 二.限流算法 1. 计数器算法 2. 漏桶算法 3. 令牌桶算法 四.Gateway 限流 1. 添加依赖 2. 配置文件 3. 限流规则配置类 Spring C ...

  6. Spring Cloud Alibaba gateway ribbon 自定义负载均衡规则。发散灰度发布,金丝雀测试等

    上一篇介绍了,ribbon的组件.本篇要自己写一个灰度方案.其实就是一个很简单的思维扩散. 需求 前端header请求携带version字段.路由服务根据version去需要对应版本的服务集合,进行或 ...

  7. 咖啡汪日志 —— 一文看懂Spring Cloud 网关ZuulFilter的使用和源码(包括FilterFactory 的讲解)

    作为乐死不疲的汪界翘楚 本汪每天不是在戏精 就是在戏精的路上了 作为一只纯种哈士奇 玩,就要玩得尽兴而归! 今天与大家一起溜溜,看看 Spring Cloud 网关 ZuulFilter ,从使用到源 ...

  8. Spring Cloud Alibaba - Gateway 入门案例(二)(Gateway 整合 nacos /(非阿里组件))

    Spring Cloud Alibaba - Gateway 入门案例(二)(Gateway 整合 nacos)(非阿里组件) 回溯 Gateway 整合 nacos 方式一(复杂/灵活/常用) 方式 ...

  9. Spring cloud 2020 gateway nacos 出现503的情况

    Spring cloud 2020 gateway nacos 出现503的情况 参考https://blog.csdn.net/weixin_39233623/article/details/121 ...

最新文章

  1. 数学:Burnside引理与Pólya定理
  2. Python+selenium 自动化-mac下安装配置chrome驱动方法
  3. CCNP精粹系列之十八--路由映射实战二,博主推荐文章
  4. 下面的语言中哪些语言是动态语言( )
  5. thread.sleep是让哪个线程休眠_Java多线程:多线程基础知识
  6. Quartz.NET快速入门指南
  7. iPhone 12 Pro/Pro Max最新渲染图曝光
  8. php sql注入审计,php审计基础一:sql注入
  9. 人狠话不多,细说大牛直播SDK之RTMP播放器和RTSP播放器...
  10. 电脑双系统完美卸载Ubuntu
  11. 使用matlab计算变上限积分,matlab含有变上限积分参数的非线性回归
  12. 【Transformer】李沐论文逐段精读学习笔记
  13. 微信小程序如何获取用户绑定手机号
  14. Distractor-aware Siamese Networks for Visual Object Tracking 论文学习
  15. 0ada5c.html,打造创新的GS重点工作管理系统
  16. codeforces 616F Expensive Strings
  17. 包包的结构制图_怪蜀黍教你做包包 篇四:做好手工皮具的基础——如何打版...
  18. 基于ros的机器人运动控制相关学习(一)
  19. matlab 右边短线,短线和大盘,最简单的短线选股方法
  20. 【JS基础】var formdata=new FormData() 【FormData用法详解 】

热门文章

  1. [ HIT - CSAPP ] 哈尔滨工业大学 - 计算机系统 - 期末大作业“Hello‘s P2P’”
  2. 如何利用JDK8彻底弄懂UNIX时间戳与时区的概念!
  3. 量化交易 第三课 数据获取接口
  4. opta planner_使用Excel Christmas Planner进行整理
  5. Golang之Shadowed Variables(幽灵变量)
  6. google ble 语音spec(voiceverBLERemotecontrol)
  7. 人工智能/数据科学比赛汇总 2019.6
  8. 参数估计-两个参数总体区间估计、样本量确定(三)
  9. 对路径“C:\inetpub\wwwroot\”的访问被拒绝
  10. VM虚拟机Ubuntu配置静态ip,亲测有效