Spring Boot 2 - Webflux - Websocket - Netty - Komprimierung
Ich benutze
- Spring-Boot-Starter-Web 2.3.1
- spring-webflux 5.2.7
- Spring-Boot-Starter-Reaktor-Anlegestelle 2.3.1
Ich versuche, Sec-WebSocket-Extensions: permessage-deflate
auf Websockets Antworten zu verwenden. Netty unterstützt die Websocket-Dekomprimierung seit Fix 507 ( verwandte Frage)
Aber es funktioniert nicht (dh der Server verwendet nicht permessage-deflate
die in Anforderungsheadern vorgeschlagenen)
Wenn ich einen Steg mit verwende spring-boot-starter-jetty
, funktioniert dies sofort, ohne dass eine zusätzliche Konfiguration erforderlich ist.
Weiß jemand, wie man das löst? Vielen Dank!
Antworten
Nach dem Betrachten des Spring-Webflux-Frameworks ist die Komprimierung im Reactor-Netty standardmäßig deaktiviert. In der Tat erstellt der Standardkonstruktor der Klasse ReactorNettyRequestUpgradeStrategy
eine Instanz des Klassenparameterwerts WebsocketServerSpec mit dem Standardwert (Komprimierung = false).
Reactor-Netty überprüft das Prädikat websocketClientSpec.compress()
, um eine Komprimierungsunterstützung einzurichten .
Der Parameter websocketClientSpec.compress
muss also aktiviert werden.
@Bean
public WebSocketHandlerAdapter handlerAdapter(WebSocketService webSocketService) {
return new WebSocketHandlerAdapter(webSocketService);
}
@Bean
public WebSocketService webSocketService() {
return new HandshakeWebSocketService(
new ReactorNettyRequestUpgradeStrategy(WebsocketServerSpec.builder().compress(true)));
}
Das Ergebnis Handshake:
