java - 无效的握手响应 getStatus: 502 Bad Gateway
问题描述
我们有 OpenShift、Istio、Cloud-gateway 微服务、几个微服务。
- 春季启动 2.3.6.RELEASE,
- Spring-Cloud Hoxton.SR9
- Spring-Cloud-Starter-Gateway 2.2.6.RELEASE
我们的问题是:无效的 websocket 握手。
当我们从我们的集合中排除 Istio 时,一切正常。此外,当使用 Istio 但不包括 Cloud-gateway 时,一切正常。
似乎问题在于 Istio 添加了标头 Content-length=0,而 Cloud-gateway 落在了 websocket 握手上。
我们该如何应对?也许我们需要在 application.yml 中添加一些东西,或者一些 bean 等?
应用程序.yml
spring:
profiles:
active: default
cloud:
discovery:
reactive:
enabled: false
kubernetes:
discovery:
enabled: false
gateway:
streaming-media-types:
- application/stream+json
- text/event-stream
- application/javascript
routes:
- id: microservice_name_websocket_sockjs_route
uri: ${MICROSERVICE_NAME_SOCKJS_URI:lb://microservice-name}
predicates:
- Path=/microservice-name/ui/groupoperations/tasks/**
filters:
- RewritePath=/microservice-name/(?<segment>.*), /$\{segment}
- id: microservice_name_webSocketRoute
uri: ${MICROSERVICE_NAME_WEBSOCKET_URI:lb:ws://microservice-name}
predicates:
- Path=/microservice-name/ui/groupoperations/tasks/**
filters:
- RewritePath=/microservice-name/(?<segment>.*), /$\{segment}
server:
port: 8889
ribbon:
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 1
ReadTimeout: 2000
ConnectTimeout: 1000
NIWSServerListClassName: io.fabric8.kubeflix.ribbon.KubernetesServerList
PortName: http
logging:
level:
ROOT: TRACE
com.corporation.project: TRACE
org.springframework: TRACE
reactor.netty.http.client: TRACE
white-list-filter:
file:
location: ${WHITE_LIST_FILE_LOCATION:classpath:filters}
fileName: ${WHITE_LIST_FILE_NAME:cloud-gateway-whitelist.list}
management:
security:
enabled: false
health:
jms:
enabled: false
endpoint:
metrics:
enabled: true
prometheus:
enabled: true
endpoints:
web:
exposure:
include: '*'
base-path: /
metrics:
export:
prometheus:
enabled: true
exception-control:
enable: false
forbidden-words-regex: (stack)|(exception)|(select)|(update)|(delete)|(insert)
action: log_only
status-to-replace: 418
body-to-replace: 'Data leak prevented'
opentracing:
jaeger:
service-name: cloud-gateway
enable-b3-propagation: true
log-spans: true
spring:
cloud:
jdbc:
enabled: false
例外:
2021-09-05 16:28:14.779 TRACE 1 --- [or-http-epoll-1] o.s.w.s.adapter.HttpWebHandlerAdapter : [2a7a738e-7] Completed 200 OK, headers={masked}
2021-09-05 16:28:14.779 TRACE 1 --- [or-http-epoll-1] o.s.h.s.r.ReactorHttpHandlerAdapter : [2a7a738e-7] Handling completed
2021-09-05 16:28:14.781 DEBUG 1 --- [or-http-epoll-4] r.netty.http.client.HttpClientConnect : [id: 0x0c5a1b20, L:/1.2.15.231:56854 - R:microservice-name/1.8.15.171:8080] Handler is being applied: {uri=ws://microservice-name:8080/ui/gp/t/516/tzc151tm/websocket, method=GET}
2021-09-05 16:28:14.803 DEBUG 1 --- [or-http-epoll-4] r.n.http.client.HttpClientOperations : [id: 0x0c5a1b20, L:/1.2.15.231:56854 - R:microservice-name/1.8.15.171:8080] Attempting to perform websocket handshake with ws://cloud-gateway.ob3dl-opa1-devel.svc.cluster.local:8889/ui/gp/t/516/tzc151tm/websocket
2021-09-05 16:28:14.828 DEBUG 1 --- [or-http-epoll-4] i.n.h.c.h.w.WebSocketClientHandshaker13 : WebSocket version 13 client handshake key: I+YlMp+qLtlj4iBhDlsBzg==, expected response: FK9mNuXf/KDCCE3Qyelp7dBdbZ8=
2021-09-05 16:28:14.891 WARN 1 --- [or-http-epoll-4] r.netty.http.client.HttpClientConnect : [id: 0x0c5a1b20, L:/1.2.15.231:56854 - R:microservice-name/1.8.15.171:8080] The connection observed an error
io.netty.handler.codec.http.websocketx.WebSocketClientHandshakeException: Invalid handshake response getStatus: 502 Bad Gateway
at io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker13.verify(WebSocketClientHandshaker13.java:272) ~[netty-codec-http-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker.finishHandshake(WebSocketClientHandshaker.java:302) ~[netty-codec-http-4.1.54.Final.jar!/:4.1.54.Final]
at reactor.netty.http.client.WebsocketClientOperations.onInboundNext(WebsocketClientOperations.java:116) ~[reactor-netty-0.9.21.RELEASE.jar!/:0.9.21.RELEASE]
at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:96) ~[reactor-netty-0.9.21.RELEASE.jar!/:0.9.21.RELEASE]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[netty-codec-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) ~[netty-codec-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) ~[netty-codec-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:795) ~[netty-transport-native-epoll-4.1.54.Final-linux-x86_64.jar!/:4.1.54.Final]
at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:480) ~[netty-transport-native-epoll-4.1.54.Final-linux-x86_64.jar!/:4.1.54.Final]
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378) ~[netty-transport-native-epoll-4.1.54.Final-linux-x86_64.jar!/:4.1.54.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.54.Final.jar!/:4.1.54.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.54.Final.jar!/:4.1.54.Final]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
解决方案
推荐阅读
- r - map() 模型输出到数据框
- visual-studio-code - 如何在 Visual Studio Code 中添加多个构建任务?
- php - 从 url 获取 php 5.1 的 json 数据
- ionic-framework - 如何从 IONIC 应用程序打开谷歌地图
- rest - 带有项目集合的 SOAP 到 Rest 转换
- c# - HttpWebRequest 与 HttpClient:处理 HTTP 100:Continue 在 HttpClient 中导致异常,但在 HttpWebRequest 中没有
- asp.net-mvc - 如何使用 . 在 ASP .NET Web Api 路由中,例如;domain.com/api/users.get?
- django-rest-framework - 为什么 django-filter 不能按预期工作
- django - 模型的字段在管理面板中被禁用
- java - java - 如何打印解析器为java中给定语法生成的解析树?