Spring Boot 2 - Webflux - Websocket - Netty - Compression

Dec 04 2020

saya menggunakan

  • pegas-boot-starter-web 2.3.1
  • spring-webflux 5.2.7
  • pegas-boot-starter-reactor-netty 2.3.1

Saya mencoba menggunakan Sec-WebSocket-Extensions: permessage-deflatetanggapan websockets. Netty mendukung dekompresi websocket sejak perbaikan 507 ( pertanyaan terkait)

Tapi itu tidak berhasil (yaitu, server tidak menggunakan yang permessage-deflatediusulkan di header permintaan)

Sedangkan ketika saya menggunakan jetty with spring-boot-starter-jetty, itu berfungsi di luar kotak, tidak perlu konfigurasi tambahan.

Adakah yang tahu bagaimana menyelesaikan ini? Terima kasih!

Jawaban

AndrianekenaMoise Jan 06 2021 at 23:33

Setelah melihat kerangka pegas-webflux, kompresi dinonaktifkan secara default di reactor-netty. Memang contructor standar kelas ReactorNettyRequestUpgradeStrategymembuat sebuah instance dari nilai parameter kelas WebsocketServerSpec dengan nilai default (kompresi = false).

Reactor-netty memeriksa predikat websocketClientSpec.compress()untuk membangun dukungan kompresi.

Jadi parameter websocketClientSpec.compressperlu diaktifkan.

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

Hasil jabat tangan: