Spring 启动 2 - Webflux - Websocket - 激活压缩
Spring Boot 2 - Webflux - Websocket - Activate Compression
我正在使用:
- Spring Boot 2.1.0 发布
- Webflux(非 MVC)
- 网络套接字
- Reactive Netty
我想用 "GZIP"(或任何其他压缩)压缩返回的有效负载。我试过 application.yml:
中的配置
server.compression.enabled: true
但返回的有效负载仍然是纯文本。
有人知道如何解决这个问题吗?谢谢
server.compression.enabled
配置属性是关于HTTP响应压缩的,所以这不会达到预期的目标。
使用 WebSocket,您可以使用协议扩展激活 per-message 压缩,前提是您选择的容器支持它。这必须在握手期间使用 Sec-WebSocket-Extensions
在客户端和服务器之间协商。所以在你的情况下,激活它是不够的,你还需要在客户端上启用它。参见 rfc7692。
某些容器(如最新版本中的 Jetty)默认启用这些压缩扩展。对于 Reactor Netty,我不确定是不是这样。
对于接下来的步骤,您可以:
- 检查您的客户端是否发送 header 并支持此协议扩展
- 切换到 Jetty 以检查它是否开箱即用
- 如果它适用于 Jetty 而不是 Reactor Netty,您应该 create an issue on their issue tracker 因为可能缺少一部分 Netty 基础设施(
WebSocketServerCompressionHandler
?)
编辑
我正在使用:
- Spring Boot 2.1.0 发布
- Webflux(非 MVC)
- 网络套接字
- Reactive Netty
我想用 "GZIP"(或任何其他压缩)压缩返回的有效负载。我试过 application.yml:
中的配置server.compression.enabled: true
但返回的有效负载仍然是纯文本。
有人知道如何解决这个问题吗?谢谢
server.compression.enabled
配置属性是关于HTTP响应压缩的,所以这不会达到预期的目标。
使用 WebSocket,您可以使用协议扩展激活 per-message 压缩,前提是您选择的容器支持它。这必须在握手期间使用 Sec-WebSocket-Extensions
在客户端和服务器之间协商。所以在你的情况下,激活它是不够的,你还需要在客户端上启用它。参见 rfc7692。
某些容器(如最新版本中的 Jetty)默认启用这些压缩扩展。对于 Reactor Netty,我不确定是不是这样。
对于接下来的步骤,您可以:
- 检查您的客户端是否发送 header 并支持此协议扩展
- 切换到 Jetty 以检查它是否开箱即用
- 如果它适用于 Jetty 而不是 Reactor Netty,您应该 create an issue on their issue tracker 因为可能缺少一部分 Netty 基础设施(
WebSocketServerCompressionHandler
?)