Могу ли я использовать SpringMvc и webflux вместе?

Я бы хотел использовать 2 подхода (реактивный и стандартный) в одном проекте.

Я попытался перенести одну конечную точку REST API на реактивный webflux и протестировать производительность перед переносом остальных. Но это не сработало. Я добавил для него маршрутизатор и обработчик, но пока я не удалил spring-boot-starter-web из зависимостей и не отключил @RestController, я все время получал код http 404. Возможно это или нет? Или мне следует перевести весь проект на реактивный подход?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
40
0
13 463
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как объясняется в справочной документации Spring Boot, Spring Boot автоматически настроит приложение Spring MVC, если доступны как MVC, так и WebFlux.. На это есть несколько причин:

  • Spring MVC не может работать на Netty
  • обе инфраструктуры будут конкурировать за одну и ту же работу (например, обслуживание статических ресурсов, сопоставлений и т. д.)
  • смешивание обеих моделей времени выполнения в одном контейнере не является хорошей идеей и, вероятно, будет работать плохо или просто не работать вообще

В зависимости от цели, которую вы пытаетесь достичь, можно поработать несколькими способами.

Если вы хотите использовать WebClient для оптимизации нескольких одновременных удаленных HTTP-вызовов и использовать операторы Reactor, вы можете продолжать использовать аннотированные контроллеры Spring MVC и возвращать реактивные типы в качестве возвращаемых значений (подробнее об этом в этом Spring Boot Talk).

Если вы хотите работать над чистой масштабируемостью и задержкой (не обязательно с исходной пропускной способностью), вы можете начать использовать spring-boot-starter-webflux и работать оттуда. Обратите внимание, что использование API-интерфейсов блокировки (таких как блокировка вызовов базы данных) запрещено, а упаковка их с помощью Flux или Mono и планирование, которое работает с отдельными пулами потоков, будут работать против вас с точки зрения производительности.

Наконец, если вы хотите использовать функциональный подход, предоставляемый Spring WebFlux, он не обязательно будет работать лучше. Это действительно зависит от вашего варианта использования и того, как вы его реализуете.

Другие вопросы по теме