Spring cloud网关gateway代理websocket报Max frame length of 65536 has been exceeded
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相关推荐
- 解决gateway转发websocket出现Max frame length of 65536 has been exceeded
项目版本: gateway:3.0.2 springboot:2.4.6 背景: 对接阿里云tts,gateway转发websocket请求,在字节流超过65536时,连接自动断开,跟踪源码发现,We ...
- netty : Max frame length of 65536 has been exceeded.
文章目录 1. 背景 解决 1. 背景 netty刚刚学的,一个聊天室程序 界面如下: 代码如下: package com.myself.nettychat.config;
- Spring Cloud 的 Gateway 服务启动报错
Spring Cloud 的 Gateway 启动报错 1.控制台错误 2.报错时主要代码配置 2.1 pom 文件 2.2 启动类 2.3 application.yml 文件 3.解决办法 1.控 ...
- Spring Cloud入门-Gateway服务网关(Hoxton版本)
文章目录 Spring Cloud入门系列汇总 摘要 Gateway 简介 相关概念 创建 api-gateway模块 在pom.xml中添加相关依赖 两种不同的配置路由方式 使用yml配置 使用Ja ...
- Spring Cloud :Gateway 网关限流(五)
目录 一.概述 1. 为什么需要限流 二.限流算法 1. 计数器算法 2. 漏桶算法 3. 令牌桶算法 四.Gateway 限流 1. 添加依赖 2. 配置文件 3. 限流规则配置类 Spring C ...
- Spring Cloud Alibaba gateway ribbon 自定义负载均衡规则。发散灰度发布,金丝雀测试等
上一篇介绍了,ribbon的组件.本篇要自己写一个灰度方案.其实就是一个很简单的思维扩散. 需求 前端header请求携带version字段.路由服务根据version去需要对应版本的服务集合,进行或 ...
- 咖啡汪日志 —— 一文看懂Spring Cloud 网关ZuulFilter的使用和源码(包括FilterFactory 的讲解)
作为乐死不疲的汪界翘楚 本汪每天不是在戏精 就是在戏精的路上了 作为一只纯种哈士奇 玩,就要玩得尽兴而归! 今天与大家一起溜溜,看看 Spring Cloud 网关 ZuulFilter ,从使用到源 ...
- Spring Cloud Alibaba - Gateway 入门案例(二)(Gateway 整合 nacos /(非阿里组件))
Spring Cloud Alibaba - Gateway 入门案例(二)(Gateway 整合 nacos)(非阿里组件) 回溯 Gateway 整合 nacos 方式一(复杂/灵活/常用) 方式 ...
- Spring cloud 2020 gateway nacos 出现503的情况
Spring cloud 2020 gateway nacos 出现503的情况 参考https://blog.csdn.net/weixin_39233623/article/details/121 ...
最新文章
- 数学:Burnside引理与Pólya定理
- Python+selenium 自动化-mac下安装配置chrome驱动方法
- CCNP精粹系列之十八--路由映射实战二,博主推荐文章
- 下面的语言中哪些语言是动态语言( )
- thread.sleep是让哪个线程休眠_Java多线程:多线程基础知识
- Quartz.NET快速入门指南
- iPhone 12 Pro/Pro Max最新渲染图曝光
- php sql注入审计,php审计基础一:sql注入
- 人狠话不多,细说大牛直播SDK之RTMP播放器和RTSP播放器...
- 电脑双系统完美卸载Ubuntu
- 使用matlab计算变上限积分,matlab含有变上限积分参数的非线性回归
- 【Transformer】李沐论文逐段精读学习笔记
- 微信小程序如何获取用户绑定手机号
- Distractor-aware Siamese Networks for Visual Object Tracking 论文学习
- 0ada5c.html,打造创新的GS重点工作管理系统
- codeforces 616F Expensive Strings
- 包包的结构制图_怪蜀黍教你做包包 篇四:做好手工皮具的基础——如何打版...
- 基于ros的机器人运动控制相关学习(一)
- matlab 右边短线,短线和大盘,最简单的短线选股方法
- 【JS基础】var formdata=new FormData() 【FormData用法详解 】
热门文章
- [ HIT - CSAPP ] 哈尔滨工业大学 - 计算机系统 - 期末大作业“Hello‘s P2P’”
- 如何利用JDK8彻底弄懂UNIX时间戳与时区的概念!
- 量化交易 第三课 数据获取接口
- opta planner_使用Excel Christmas Planner进行整理
- Golang之Shadowed Variables(幽灵变量)
- google ble 语音spec(voiceverBLERemotecontrol)
- 人工智能/数据科学比赛汇总 2019.6
- 参数估计-两个参数总体区间估计、样本量确定(三)
- 对路径“C:\inetpub\wwwroot\”的访问被拒绝
- VM虚拟机Ubuntu配置静态ip,亲测有效