web-dev-qa-db-fra.com

Puis-je utiliser Spring Mvc et webflux ensemble?

Je souhaite utiliser 2 approches (réactive et standard) dans un projet.

J'ai essayé de migrer un REST point de terminaison API vers webflux réactif et tester les performances avant de migrer le reste d'entre eux. Mais cela n'a pas fonctionné. J'ai ajouté un routeur et un gestionnaire pour lui, mais jusqu'à ce que je ne le fasse pas retirer spring-boot-starter-web des dépendances et désactivez @RestController J'ai eu http 404 code tout le temps. Est-ce possible ou non? Ou dois-je migrer tous les projets vers une approche réactive?

10
Vladislav Kysliy

Comme expliqué dans la documentation de référence de Spring Boot, Spring Boot configurera automatiquement une application Spring MVC si MVC et WebFlux sont disponibles . Il y a plusieurs raisons à cela:

  • Spring MVC ne peut pas fonctionner sur Netty
  • les deux infrastructures seront en concurrence pour le même travail (par exemple, servir des ressources statiques, les mappages, etc.)
  • mélanger les deux modèles d'exécution dans le même conteneur n'est pas une bonne idée et risque de mal fonctionner ou tout simplement de ne pas fonctionner du tout

Selon l'objectif que vous essayez d'atteindre, il peut y avoir plusieurs façons de travailler sur ce point.

Si vous souhaitez utiliser WebClient pour optimiser plusieurs appels HTTP distants simultanés et utiliser des opérateurs Reactor, vous pouvez continuer à utiliser des contrôleurs annotés Spring MVC et renvoyer des types réactifs comme valeurs de retour ( plus sur ce dans cette conférence Spring Boot ).

Si vous souhaitez travailler sur une évolutivité et une latence pures (donc pas nécessairement un débit brut), vous pouvez commencer à utiliser spring-boot-starter-webflux et travailler à partir de là. Notez que l'utilisation des API de blocage (comme le blocage des appels de base de données) est interdite, et le fait d'encapsuler ceux avec Flux ou Mono et la planification qui fonctionnent sur des pools de threads distincts fonctionneront contre vous du côté des performances.

Enfin, si vous souhaitez utiliser l'approche fonctionnelle fournie par Spring WebFlux, il ne fonctionnera pas nécessairement mieux. Cela dépend vraiment de votre cas d'utilisation et de la façon dont vous l'implémentez.

17
Brian Clozel