Spring Boot 2 - Webflux - Websocket - Netty - Сжатие

Dec 04 2020

я использую

  • весна-загрузка-стартер-сеть 2.3.1
  • весна-webflux 5.2.7
  • пружина-загрузка-стартер-реактор-netty 2.3.1

Я пытаюсь использовать Sec-WebSocket-Extensions: permessage-deflateответы веб-сокетов. Netty поддерживает распаковку веб-сокетов с момента исправления 507 ( связанный вопрос)

Но это не работает (т.е. сервер не использует permessage-deflateпредложенные в заголовках запросов)

В то время как, когда я использую причал с spring-boot-starter-jetty, он работает из коробки, дополнительная настройка не требуется.

Кто-нибудь знает, как это решить? Спасибо!

Ответы

AndrianekenaMoise Jan 06 2021 at 23:33

Посмотрев на фреймворк spring-webflux, сжатие по умолчанию отключено в файле response-netty. Действительно, конструктор класса по умолчаниюReactorNettyRequestUpgradeStrategy создает экземпляр значения параметра класса WebsocketServerSpec со значением по умолчанию (сжатие = false).

Reactor-netty проверяет предикат, websocketClientSpec.compress()чтобы установить поддержку сжатия.

Значит, параметр websocketClientSpec.compressнужно активировать.

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

Результат рукопожатия: