问题描述
我正在使用 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 (将#修改为@)