Spring Boot 2 - Webflux - Websocket - Netty - Compression

Dec 04 2020

j'utilise

  • ressort-boot-starter-web 2.3.1
  • spring-webflux 5.2.7
  • ressort-démarrage-démarreur-réacteur-netty 2.3.1

J'essaie d'utiliser Sec-WebSocket-Extensions: permessage-deflatesur les réponses Websockets. Netty prend en charge la décompression Websocket depuis le correctif 507 ( question connexe)

Mais cela ne fonctionne pas (c'est-à-dire que le serveur n'utilise pas permessage-deflateles en-têtes de requête proposés)

Alors que lorsque j'utilise jetty avec spring-boot-starter-jetty, cela fonctionne hors de la boîte, aucune configuration supplémentaire n'est nécessaire.

Quelqu'un sait-il comment résoudre ce problème? Merci!

Réponses

AndrianekenaMoise Jan 06 2021 at 23:33

Après avoir examiné le framework spring-webflux, la compression est désactivée par défaut dans le fichier reacteur-netty. En effet, le constructeur par défaut de la classe ReactorNettyRequestUpgradeStrategycrée une instance de la valeur du paramètre de classe WebsocketServerSpec avec la valeur par défaut (compression = false).

Reactor-netty vérifie le prédicat websocketClientSpec.compress()pour établir un support de compression.

Le paramètre websocketClientSpec.compressdoit donc être activé.

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

Le résultat de la poignée de main: