Spring Boot 2 - Webflux - Websocket - Netty - Compression
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-deflate
sur 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-deflate
les 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
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 ReactorNettyRequestUpgradeStrategy
cré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.compress
doit 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:
