Spring Boot 2 - Webflux - Websocket - Netty - Komprimierung

Dec 04 2020

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-deflateauf 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-deflatedie 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

AndrianekenaMoise Jan 06 2021 at 23:33

Nach dem Betrachten des Spring-Webflux-Frameworks ist die Komprimierung im Reactor-Netty standardmäßig deaktiviert. In der Tat erstellt der Standardkonstruktor der Klasse ReactorNettyRequestUpgradeStrategyeine 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.compressmuss 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: