项目场景:

``

项目需要后台主动实时推送数据到前端,后台使用了websocket,前端通过网关gateway与后台建立连接。


问题描述

前端直接连接websocket服务数据正常返回,连接网关gateway后,连接返回状态101连接成功,gateway无报错信息,websocket服务后台也正常收到连接和返回数据,但是前端一直没有收到数据。

原因分析:

搜索许久,一直没有搜索到类似的问题,偶然翻到一篇文章,gateway对websocket返回的数据大小有限制,重新配置了gateway对websocket数据的大小的限制后恢复正常。


解决方案:

具体的解决代码:gateway是使用netty的,所以websocket也是netty的,当websocket请求到网关的时候,网关会创建WebSocketService来转发你的请求,当具体微服务返回webSocket信息是,网关会创建ReactorNettyWebSocketClient来接收你微服务的返回数据来给客户端返回。

所以网关中webSocket设置数据大小我们要分别设置服务端接收的大小和客户端返回数据大小。

@Bean
//如果有多个的WebSocketService注入到spring容器,优先使用这个
@Primary
public WebSocketService customWebSocketService() {
ReactorNettyRequestUpgradeStrategy requestUpgradeStrategy =new ReactorNettyRequestUpgradeStrategy();
requestUpgradeStrategy.setMaxFramePayloadLength(DEFAULT_FRAME_MAX_SIZE);
return new HandshakeWebSocketService(requestUpgradeStrategy);
}
/**
* 上面的bean是websocket服务端的,负责设置接收数据的大小
* 这个bean是websocket客户端的,负责设置返回数据的大小
* @return
*/
@Bean
@Primary
public ReactorNettyWebSocketClient customReactorNettyWebSocketClient() {
ReactorNettyWebSocketClient reactorNettyWebSocketClient =new ReactorNettyWebSocketClient();
reactorNettyWebSocketClient.setMaxFramePayloadLength(DEFAULT_FRAME_MAX_SIZE);
return reactorNettyWebSocketClient;
}
 DEFAULT_FRAME_MAX_SIZE自行设置
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐