Spring Boot 2 - Webflux - Websocket - Netty - Kompresja
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-deflate
odpowiedzi w WebSockets. Netty obsługuje dekompresję WebSocket od poprawki 507 ( powiązane pytanie)
Ale to nie działa (tj. Serwer nie używa permessage-deflate
proponowanych 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
Po przyjrzeniu się strukturze spring-webflux kompresja jest domyślnie wyłączona w sieci reaktorów. Rzeczywiście, domyślny konstruktor klasy ReactorNettyRequestUpgradeStrategy
tworzy 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.compress
należ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:
