启用 HTTP2 + TLS 时,Websocket 端点停止工作

问题描述 投票:0回答:1

我们有一个 WebSocket 服务器(在 Spring Boot 上编写),它位于 Spring Cloud Gateway

我已在 Spring Boot 上为网关和 Websocket 启用

HTTP2

当网关和 Websocket 上都禁用 TLS 时,Websocket 可以正常工作。客户端和服务器都可以交换消息。

当我在双方都启用 TLS 时,问题就出现了。客户端使用

wscat wss:\\websocket-url
调用WebSocket端点,网关日志显示路由已找到,请求成功并且连接已成功升级到WebSocket。 但是Websocket Server端并没有调用。我没有看到任何一方有任何错误。

我通过设置启用了 TLS 调试

System.setProperty("javax.net.debug", "ssl:handshake");

我可以看到 TLS 握手也成功,没有任何问题。你能建议一下这里出了什么问题吗?

Spring Boot v2 和 v3 都会出现此问题。我们正在使用 Java 17

spring-boot websocket http2 spring-websocket spring-cloud-gateway
1个回答
0
投票

问题实际上并不在于 Websocket,而是双重

http/1.1
+
http/2
支持。

大多数服务器(包括 Netty 和 Tomcat)不支持基于 HTTP/2 的 WebSocket。有一个最近更新的建议标准,RFC 8441,但我在 Tomcat 或 Netty 中找不到任何此类支持的痕迹。

我想这里的问题是关于设置一致性 - 当启用

HTTP/1.1
时,我们应该启用还是禁用
HTTP/2
?就我而言,不需要
HTTP/2
,因此我禁用了它。 Websocket 开始与 TLS 无缝协作。

最初,我配置了 Spring Boot 应用程序以启用

HTTP/2
(禁用 TLS)。尽管这不是
HTTP/2
的先决条件,但如果未启用 TLS,大多数服务器不会将连接从
HTTP/1
升级到
HTTP/2
。因此 Websocket API 工作正常

© www.soinside.com 2019 - 2024. All rights reserved.