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

项目版本:
gateway:3.0.2
springboot:2.4.6

背景:
对接阿里云tts,gateway转发websocket请求,在字节流超过65536时,连接自动断开,跟踪源码发现,WebsocketSpec限制了单次发送消息的最大字节数,目前还未找到动态配置的方法,如果有大神找到了欢迎告知
在这里插入图片描述

在这里插入图片描述

解决方案:
思路就是在项目启动完成后直接拿到ReactorNettyRequestUpgradeStrategy和ReactorNettyWebSocketClient,把里面的maxFramePayloadLength,也就是最大帧有效负载长度,通过反射改为想要的长度,代码:


```java
@Component
public class GatewayRunner implements ApplicationRunner, ApplicationContextAware {

    @Value("${websocket.maxFramePayloadLength}")
    private Integer maxFramePayloadLength;
    private ApplicationContext applicationContext;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Assert.notNull(maxFramePayloadLength, "maxFramePayloadLength Cannot be empty");
        ReactorNettyRequestUpgradeStrategy bean = applicationContext.getBean(ReactorNettyRequestUpgradeStrategy.class);
        Class<? extends ReactorNettyRequestUpgradeStrategy> aClass = bean.getClass();
        Field field = aClass.getDeclaredField("maxFramePayloadLength");
        field.setAccessible(true);
        field.set(bean, maxFramePayloadLength);
        ReactorNettyWebSocketClient bean1 = applicationContext.getBean(ReactorNettyWebSocketClient.class);
        Class<? extends ReactorNettyWebSocketClient> aClass1 = bean1.getClass();
        Field field1 = aClass1.getDeclaredField("maxFramePayloadLength");
        field1.setAccessible(true);
        field1.set(bean1, maxFramePayloadLength);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值