获得徽章 0
赞了这篇沸点
## 老版本spring cloud gateway转发websocket, 超过64kb报错, 怎么解决?
spring cloud gateway转发websocket, 数据超过64kb报错:
io.netty.handler.codec.CorruptedFrameException: Max frame length of 65536 has been exceeded.

网上查到的资料:
- 高版本可以配置最大值: `spring.cloud.gateway.httpclient.websocket.max-frame-payload-length`
- 低版本要覆盖源码: `NettyWebSocketSessionSupport` 的 `DEFAULT_FRAME_MAX_SIZE`

"覆盖源码"的意思是: 把源码文件直接拷贝在项目里, 保持相同包名、相同类名, 项目启动的时候会优先加载项目里的类, 从而覆盖掉jar包里的类; 是一种hack的修改源码的方法, 一般迫不得已才这么用;

我的项目的spring cloud gateway是很老的版本, 2.0.2;
实测覆盖NettyWebSocketSessionSupport无效;
最终发现需要覆盖这两个类: WebSocketClientHandshakerFactory、WebSocketServerHandshakerFactory

调试的方法:
- 给报错的位置打断点, 沿着调用堆栈向上看出错逻辑, 出错是因为当前数据大于最大值;
- 最大值是构造函数里初始化的, 给构造函数打断点, 沿着调用堆栈向上找, 看最大值是哪里传过来的;
- 不断重复这个过程, 最终发现, 最大值是源码里写死的, 没法配置, 只能覆盖源码;
展开
1
个人成就
文章被阅读 3,262
掘力值 138
收藏集
0
关注标签
3
加入于