Spring Boot 2 - Webflux - Websocket - Netty - Kompresja

Dec 04 2020

używam

  • spring-boot-starter-web 2.3.1
  • spring-webflux 5.2.7
  • reaktor-rozrusznika-sprężynowego-siatka 2.3.1

Próbuję użyć Sec-WebSocket-Extensions: permessage-deflateodpowiedzi w WebSockets. Netty obsługuje dekompresję WebSocket od poprawki 507 ( powiązane pytanie)

Ale to nie działa (tj. Serwer nie używa permessage-deflateproponowanych w nagłówkach żądań)

Natomiast kiedy używam pomostu z spring-boot-starter-jetty, działa po wyjęciu z pudełka, nie jest wymagana dodatkowa konfiguracja.

Czy ktoś wie, jak to rozwiązać? Dzięki!

Odpowiedzi

AndrianekenaMoise Jan 06 2021 at 23:33

Po przyjrzeniu się strukturze spring-webflux kompresja jest domyślnie wyłączona w sieci reaktorów. Rzeczywiście, domyślny konstruktor klasy ReactorNettyRequestUpgradeStrategytworzy instancję parametru klasy o wartości WebsocketServerSpec z wartością domyślną (kompresja = false).

Sieć reaktorów sprawdza predykat, websocketClientSpec.compress()aby ustalić wsparcie kompresji.

Dlatego parametr websocketClientSpec.compressnależy aktywować.

@Bean
public WebSocketHandlerAdapter handlerAdapter(WebSocketService webSocketService) {
return new WebSocketHandlerAdapter(webSocketService);
}
@Bean
public WebSocketService webSocketService() {
return new HandshakeWebSocketService(
new ReactorNettyRequestUpgradeStrategy(WebsocketServerSpec.builder().compress(true)));
}

Wynik uścisku dłoni: