带有 websocket 的 spring 云网关正在返回 UnsupportedOperationException

问题描述

我正在使用 spring-cloud-gateway。因此,我正在尝试路由到使用 stomp 和 spring-boot-starter-websocket 实现的启用了 websocket 的微服务。

云网关路由代码

路由配置

@Configuration
public class RouteConfig {

    private static final Logger logger = org.slf4j.LoggerFactory.getLogger(RouteConfig.class);

    public RouteConfig() {

    }


    @Bean
    public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
        RouteLocatorBuilder.Builder routeBuilder = builder.routes();
        routeBuilder.route(
                r -> r.order(1).path("/websocket-microservice/**")
                        .uri("http://localhost:9500")
                        .id("websocket-microservice-route1")
        );

        return routeBuilder.build();
    }
}

它能够路由到另一个微服务并获得 /info,但在 websocket 期间它给出了异常 Error was received while reading the incoming data. The connection will be closed. java.lang.UnsupportedOperationException: null

21-01-16 Sat 14:11:47.464 DEBUG 11668 --- [oundedElastic-1] DefaultWebSessionManager                 : Created new WebSession.
21-01-16 Sat 14:11:47.491 DEBUG 11668 --- [oundedElastic-1] RoutePredicateHandlerMapping             : Route matched: websocket-microservice-2
21-01-16 Sat 14:11:47.491 DEBUG 11668 --- [oundedElastic-1] RoutePredicateHandlerMapping             : Mapping [Exchange: GET http://localhost:9300/websocket-microservice/websocket-example/info] to Route{id='websocket-microservice-2',uri=http://localhost:9500,order=1,predicate=Paths: [/websocket-microservice/**],match trailing slash: true,gatewayFilters=[],Metadata={}}
21-01-16 Sat 14:11:47.491 DEBUG 11668 --- [oundedElastic-1] RoutePredicateHandlerMapping             : [775f87a8] Mapped to org.springframework.cloud.gateway.handler.FilteringWebHandler@78b293a
21-01-16 Sat 14:11:47.491 DEBUG 11668 --- [oundedElastic-1] FilteringWebHandler                      : Sorted gatewayFilterFactories: [[GatewayFilteradapter{delegate=org.springframework.cloud.gateway.filter.RemoveCachedBodyFilter@685e5967},order = -2147483648],[GatewayFilteradapter{delegate=org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter@59b43e35},order = -2147482648],[GatewayFilteradapter{delegate=org.springframework.cloud.gateway.filter.NettyWriteResponseFilter@2a1be9f8},order = -1],[GatewayFilteradapter{delegate=org.springframework.cloud.gateway.filter.ForwardpathFilter@599fab92},order = 0],[GatewayFilteradapter{delegate=org.springframework.cloud.gateway.filter.GatewayMetricsFilter@369d624d},[GatewayFilteradapter{delegate=org.springframework.cloud.gateway.filter.RoutetoRequestUrlFilter@106387cf},order = 10000],[GatewayFilteradapter{delegate=org.springframework.cloud.gateway.config.GatewayNoLoadBalancerClientAutoConfiguration$NoLoadBalancerClientFilter@6e2e11ee},order = 10100],[GatewayFilteradapter{delegate=org.springframework.cloud.gateway.filter.WebsocketRoutingFilter@18b88f7},order = 2147483646],[GatewayFilteradapter{delegate=org.springframework.cloud.gateway.filter.NettyRoutingFilter@31887330},order = 2147483647],[GatewayFilteradapter{delegate=org.springframework.cloud.gateway.filter.ForwardRoutingFilter@3d3c14c3},order = 2147483647]]
21-01-16 Sat 14:11:47.727 DEBUG 11668 --- [or-http-epoll-1] HttpWebHandlerAdapter                    : [775f87a8] Completed 200 OK
21-01-16 Sat 14:11:47.749 DEBUG 11668 --- [nio-9300-exec-3] HttpWebHandlerAdapter                    : [8299d91] HTTP GET "/websocket-microservice/websocket-example/182/d413fcafc6f241428356792bf97bdbf9/websocket"
21-01-16 Sat 14:11:47.752 DEBUG 11668 --- [oundedElastic-1] DefaultWebSessionManager                 : Created new WebSession.
21-01-16 Sat 14:11:47.754 DEBUG 11668 --- [oundedElastic-1] RoutePredicateHandlerMapping             : Route matched: websocket-microservice-2
21-01-16 Sat 14:11:47.754 DEBUG 11668 --- [oundedElastic-1] RoutePredicateHandlerMapping             : Mapping [Exchange: GET http://localhost:9300/websocket-microservice/websocket-example/182/d413fcafc6f241428356792bf97bdbf9/websocket] to Route{id='websocket-microservice-2',Metadata={}}
21-01-16 Sat 14:11:47.754 DEBUG 11668 --- [oundedElastic-1] RoutePredicateHandlerMapping             : [8299d91] Mapped to org.springframework.cloud.gateway.handler.FilteringWebHandler@78b293a
21-01-16 Sat 14:11:47.754 DEBUG 11668 --- [oundedElastic-1] FilteringWebHandler                      : Sorted gatewayFilterFactories: [[GatewayFilteradapter{delegate=org.springframework.cloud.gateway.filter.RemoveCachedBodyFilter@685e5967},order = 2147483647]]
21-01-16 Sat 14:11:47.769 DEBUG 11668 --- [oundedElastic-1] HttpWebHandlerAdapter                    : [8299d91] Completed 101 SWITCHING_PROTOCOLS
21-01-16 Sat 14:11:47.780 DEBUG 11668 --- [nio-9300-exec-4] TomcatWebSocketSession                   : [8299d91] Session id "0" for http://localhost:9300/websocket-microservice/websocket-example/182/d413fcafc6f241428356792bf97bdbf9/websocket
21-01-16 Sat 14:11:47.787 DEBUG 11668 --- [nio-9300-exec-4] ReactorNettyWebSocketClient              : Connecting to ws://localhost:9500/websocket-microservice/websocket-example/182/d413fcafc6f241428356792bf97bdbf9/websocket
21-01-16 Sat 14:11:47.811 DEBUG 11668 --- [or-http-epoll-1] ReactorNettyWebSocketSession             : [701ae56d] Session id "701ae56d" for ws://localhost:9500/websocket-microservice/websocket-example/182/d413fcafc6f241428356792bf97bdbf9/websocket
21-01-16 Sat 14:11:47.811 DEBUG 11668 --- [or-http-epoll-1] ReactorNettyWebSocketClient              : Started session '701ae56d' for ws://localhost:9500/websocket-microservice/websocket-example/182/d413fcafc6f241428356792bf97bdbf9/websocket
21-01-16 Sat 14:11:47.829 ERROR 11668 --- [or-http-epoll-1] ChannelOperationsHandler                 : [id: 0x13b897da,L:/127.0.0.1:60366 - R:localhost/127.0.0.1:9500] Error was received while reading the incoming data. The connection will be closed.
java.lang.UnsupportedOperationException: null
    at java.base/java.nio.ByteBuffer.array(ByteBuffer.java:1041) ~[na:na]
    at org.springframework.web.reactive.socket.adapter.StandardWebSocketSession.sendMessage(StandardWebSocketSession.java:80) ~[spring-webflux-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.web.reactive.socket.adapter.AbstractListenerWebSocketSession$WebSocketSendProcessor.write(AbstractListenerWebSocketSession.java:305) ~[spring-webflux-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.web.reactive.socket.adapter.AbstractListenerWebSocketSession$WebSocketSendProcessor.write(AbstractListenerWebSocketSession.java:286) ~[spring-webflux-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.http.server.reactive.AbstractListenerWriteProcessor$State$3.onWritePossible(AbstractListenerWriteProcessor.java:372) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.http.server.reactive.AbstractListenerWriteProcessor.onWritePossible(AbstractListenerWriteProcessor.java:152) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.http.server.reactive.AbstractListenerWriteProcessor.writeIfPossible(AbstractListenerWriteProcessor.java:291) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.http.server.reactive.AbstractListenerWriteProcessor.changeStatetoReceived(AbstractListenerWriteProcessor.java:270) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.http.server.reactive.AbstractListenerWriteProcessor.access$400(AbstractListenerWriteProcessor.java:45) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.http.server.reactive.AbstractListenerWriteProcessor$State$2.onNext(AbstractListenerWriteProcessor.java:351) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.http.server.reactive.AbstractListenerWriteProcessor.onNext(AbstractListenerWriteProcessor.java:116) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at reactor.core.publisher.StrictSubscriber.onNext(StrictSubscriber.java:89) ~[reactor-core-3.3.4.RELEASE.jar:3.3.4.RELEASE]
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192) ~[reactor-core-3.3.4.RELEASE.jar:3.3.4.RELEASE]
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192) ~[reactor-core-3.3.4.RELEASE.jar:3.3.4.RELEASE]
    at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:114) ~[reactor-core-3.3.4.RELEASE.jar:3.3.4.RELEASE]
    at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:114) ~[reactor-core-3.3.4.RELEASE.jar:3.3.4.RELEASE]
    at reactor.core.publisher.FluxFilter$FilterSubscriber.onNext(FluxFilter.java:107) ~[reactor-core-3.3.4.RELEASE.jar:3.3.4.RELEASE]
    at reactor.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:220) ~[reactor-netty-0.9.6.RELEASE.jar:0.9.6.RELEASE]
    at reactor.netty.channel.FluxReceive.onInboundNext(FluxReceive.java:353) ~[reactor-netty-0.9.6.RELEASE.jar:0.9.6.RELEASE]
    at reactor.netty.channel.ChannelOperations.onInboundNext(ChannelOperations.java:352) ~[reactor-netty-0.9.6.RELEASE.jar:0.9.6.RELEASE]
    at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:634) ~[reactor-netty-0.9.6.RELEASE.jar:0.9.6.RELEASE]
    at reactor.netty.http.client.WebsocketClientOperations.onInboundNext(WebsocketClientOperations.java:157) ~[reactor-netty-0.9.6.RELEASE.jar:0.9.6.RELEASE]
    at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:90) ~[reactor-netty-0.9.6.RELEASE.jar:0.9.6.RELEASE]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.handler.codec.MessagetoMessageDecoder.channelRead(MessagetoMessageDecoder.java:102) ~[netty-codec-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.handler.codec.BytetoMessageDecoder.fireChannelRead(BytetoMessageDecoder.java:321) ~[netty-codec-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.handler.codec.BytetoMessageDecoder.channelRead(BytetoMessageDecoder.java:295) ~[netty-codec-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:792) ~[netty-transport-native-epoll-4.1.48.Final-linux-x86_64.jar:4.1.48.Final]
    at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:475) ~[netty-transport-native-epoll-4.1.48.Final-linux-x86_64.jar:4.1.48.Final]
    at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378) ~[netty-transport-native-epoll-4.1.48.Final-linux-x86_64.jar:4.1.48.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.48.Final.jar:4.1.48.Final]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.48.Final.jar:4.1.48.Final]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

使用

实现的websocket-microservice
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

websocket 微服务也不例外,它正在接收以下请求

/websocket-example/info /websocket-example/182/d413fcafc6f241428356792bf97bdbf9/websocket

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)