我们有一个 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
问题实际上并不在于 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 工作正常