Programmation réactive en Java avec Project Reactor et Spring Webflux
Jul 29, 2025 am 12:04 AMLa programmation réactive implémente des services de non-bloqueur à faible latence et à faible latence en Java via Project Reactor et Spring Webflux. 1. Project Reactor fournit deux types de noyaux: Mono et Flux, prend en charge le traitement déclaratif des flux de données asynchrones et convertis, filtres et autres opérations via des cha?nes d'opérateurs; 2. Spring WebFlux est construit sur Reactor, prend en charge deux modèles de programmation d'annotation et de fonctionnel. Il fonctionne sur des serveurs non bloquants tels que Netty et peut gérer efficacement de grandes quantités de connexions simultanées; 3. L'utilisation du réacteur WebFlux peut améliorer les capacités de concurrence et l'utilisation des ressources dans les scénarios à forte intensité d'E / O, prend naturellement prend en charge les communications en streaming telles que SSE et WebSocket, et s'intègre de manière transparente à des bases de données réactives telles que R2DBC et MongoDB; 4. Dans les applications réelles, le code de blocage doit être évité, la logique métier ne doit pas être écrite en abonnement, et les mécanismes de garantie de délai et d'erreur doivent être utilisés raisonnablement; 5. Bien que la courbe d'apprentissage soit raide et ne convient pas aux taches à forte intensité de processeur, cette combinaison peut améliorer considérablement le débit du système et la résilience dans les microservices, les passerelles et les systèmes en temps réel, et mérite d'être adopté dans des scénarios appropriés.
La programmation réactive est devenue de plus en plus importante en Java ces dernières années, en particulier dans les applications Web modernes avec une concurrence élevée et une faible latence. Avec Project Reactor et Spring WebFlux , les développeurs Java peuvent facilement créer des services non bloquants et modérés. Voyons comment ils travaillent ensemble et pourquoi vous devriez envisager de les utiliser.

Qu'est-ce que la programmation réactive?
La programmation réactive est un paradigme de programmation pour le flux de données et la propagation des changements . Il vous permet de gérer les flux de données asynchrones de manière déclarative, tels que les demandes HTTP, les réponses de la base de données, les files d'attente de messages, etc.
Dans la programmation de blocage traditionnelle, chaque demande occupe un fil et attend la fin de l'opération d'E / S. Dans la programmation réactive, les threads ne sont pas bloqués, mais ne sont traités que lorsque les données sont disponibles via le mécanisme "rappel" ou "publier-abonnement".

Réacteur du projet: la bibliothèque de base pour la programmation réactive
Project Reactor est une bibliothèque JVM de base créée par l'équipe Spring pour les systèmes réactifs. Il s'agit d'une implémentation de Reactor 3 et est entièrement compatible avec la spécification des flux réactifs .
Il fournit deux types de noyau:

-
Mono<t></t>
: représente une séquence asynchrone de 0 ou 1 élément (par exemple: résultats de requête utilisateur unique) -
Flux<t></t>
: représente un flux de données asynchrones de 0 vers n éléments (par exemple: obtenir tous les utilisateurs)
// Exemple: créer un flux Flux <string> noms = flux.Just ("Alice", "Bob", "Charlie"); // Créer un mono Mono <string> single = mono.Just ("Hello");
Vous pouvez encha?ner ces flux, tels que map
, filter
, flatMap
, delayElements
, etc .:
noms .map (String :: ToupperCase) .DelayElements (durée.ofmillis (500)) .Subscribe (System.out :: println);
Remarque: Le code ci-dessus n'est pas bloquant et ne sera pas exécuté immédiatement, mais "déclarer" le comportement du flux de données et ne sera déclenché qu'à un "abonné" n'appara?t.
Spring Webflux: Framework Web réactif
Spring WebFlux est un cadre Web réactif introduit par le printemps 5. Il peut remplacer le Spring MVC traditionnel et prend en charge deux modèles de programmation:
Contr?leur annoté (similaire à Spring MVC):
@RestController classe publique UserController { @Getmapping ("/ utilisateurs") FLUX PUBLIQUE <UTERD> GETALLUSERS () { return userservice.findall (); // Retour FLUX <DERS } @Getmapping ("/ utilisateurs / {id}") public mono <User> getUserById (@pathvariable String id) { return userService.FindById (id); // retourne mono <servy> } }
Modèle de routage fonctionnel (léger, fonctionnel):
@Haricot Public RouterFunction <ServerResponse> Route (UserHandler Handler) { Retour Route (get ("/ utilisateurs"), Handler :: getAllusers) .AndRoute (get ("/ utilisateurs / {id}"), Handler :: getUserById); }
WebFlux prend en charge les serveurs non bloquants tels que Netty et Undertow, Netty est recommandé (la valeur par défaut est intégrée dans Spring Boot pour utiliser Reactor Netty).
Pourquoi utiliser le réacteur Webflux?
Capacité de concurrence plus élevée
Tomcat traditionnel occupe un fil par demande et le pool de threads est limité. WebFlux utilise un petit nombre de threads de boucle d'événements (boucles d'événements) qui peuvent gérer des milliers de connexions simultanées.Meilleure utilisation des ressources
Les E / S non bloquantes réduisent l'attente du thread, ce qui rend l'utilisation du processeur et de la mémoire plus efficace.Support naturel pour les données de streaming
Des scénarios tels que SSE (événements de serveur), WebSocket, flux de fichiers, push en temps réel, etc. sont très appropriés.Intégration transparente avec Spring Eco
Prend en charge MongoDB réactif, PostgreSQL (via R2DBC), Redis (laitue), Kafka, etc.
Recommandations et précautions pour une utilisation
Bien que les avantages de la programmation réactive soient évidents, ce n'est pas une solution miracle. Voici quelques points clés:
- ? Convient pour les scénarios à forte intensité d'E / O : tels que l'appel des API externes, l'accès à la base de données et le traitement des messages.
- ?Con ne convient pas aux taches à forte intensité de processeur : la réactivité n'améliore pas les performances informatiques, mais peut augmenter la complexité.
- ?? Ne mélangez pas le code de blocage : l'appel
Thread.sleep()
ou le blocage de l'accès à la base de données enMono/Flux
détruira l'avantage réactif. - ? évitez d'écrire une logique commerciale en abonnez-vous : essayez d'utiliser le traitement de la cha?ne des opérateurs pour maintenir le style fonctionnel.
- ? La courbe d'apprentissage est plus raide : les concepts de contre-pression, le planificateur, le flux chaud et froid nécessitent du temps pour ma?triser.
Exemple pratique: appeler une API externe
Supposons que nous souhaitions obtenir des informations utilisateur à partir d'un service externe et effectuer la conversion:
@Service classe publique UserService { privé final webClient webClient = webClient.create ("https://api.example.com"); public Mono <User> fetchuser (String id) { return webClient.get () .uri ("/ utilisateurs / {id}", id) .récupérer() .BodyTomono (externalUser.class) .map (ceci :: ConvertTousser) .Timeout (durée.ofseconds (3)) // TimeOut Control.OnErrorTurn (user.Empty ()); // Garantie d'erreur} }
L'ensemble du processus est non bloquant et plusieurs demandes peuvent être traitées en parallèle sans consommer des threads supplémentaires.
Résumer
- Project Reactor fournit des opérations de base pour les flux réactifs (
Mono
/Flux
) - Spring Webflux est construit sur Reactor pour implémenter des services Web réactifs
- Combinaison des deux, adaptées à des applications à forte concurrence et à intensités d'E / S
- Lorsque vous l'utilisez, vous devez éviter de bloquer les opérations et comprendre le mécanisme de contre-pression et de planification
La programmation réactive n'est pas nécessaire partout, mais dans le bon scénario, il peut améliorer considérablement le débit et la résilience du système. Si vous construisez un microservice, une passerelle, une interface en temps réel ou un système de traitement de flux, le réacteur WebFlux mérite une considération sérieuse.
Fondamentalement, tout est, pas compliqué, mais il est facile d'ignorer les détails.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Maven est un outil standard pour la gestion et la construction de projet Java. La réponse réside dans le fait qu'il utilise pom.xml pour normaliser la structure du projet, la gestion des dépendances, l'automatisation du cycle de vie de la construction et les extensions de plug-in; 1. Utilisez pom.xml pour définir GroupID, Arfactive, version et dépendances; 2. Commandes Master Core telles que MvnClean, compiler, tester, package, installer et déploier; 3. Utiliser la fonction de dépendance et les exclusions pour gérer les versions et les conflits de dépendance; 4. Organisez de grandes applications via la structure du projet multi-modules et sont gérées uniformément par le POM parent; 5

Setupamaven / gradleprojectwithjax-rsDependces likejersey; 2.CreateArestResourceUsingannotationsSuchas @ pathand @ get; 3.ConfigureTheApplicationViaApplicationsUbclassorweb.xml; 4.AddjacksonforjsonBindingByCludingJersey-Media-Json-Jackson; 5.DeploEp

Pour générer des valeurs de hachage à l'aide de Java, il peut être implémenté via la classe MessagediGest. 1. Obtenez une instance de l'algorithme spécifié, tel que MD5 ou SHA-256; 2. Appelez la méthode .update () à transmettre les données à chiffrer; 3. Appelez la méthode .digest () pour obtenir un tableau d'octets de hachat; 4. Convertir le tableau d'octets en une cha?ne hexadécimale pour la lecture; Pour les entrées telles que les fichiers gros, lisez dans des morceaux et appelez .Update () plusieurs fois; Il est recommandé d'utiliser SHA-256 au lieu de MD5 ou SHA-1 pour assurer la sécurité.

Comprendre les composants centraux de la blockchain, y compris les blocs, les hachages, les structures de cha?ne, les mécanismes de consensus et l'immuabilité; 2. Créez une classe de bloc qui contient des données, des horodatages, un hachage et nonce précédent, et implémentez le calcul du hachage SHA-256 et la preuve de l'exploitation de travail; 3. Construisez une classe de blockchain pour gérer les listes de blocs, initialiser le bloc Genesis, ajouter de nouveaux blocs et vérifier l'intégrité de la cha?ne; 4. écrivez la blockchain de test principal, ajoutez des blocs de données de transaction à son tour et à l'état de la cha?ne de sortie; 5. Les fonctions d'amélioration facultatives incluent la prise en charge des transactions, le réseau P2P, la signature numérique, la restapi et la persistance des données; 6. Vous pouvez utiliser des bibliothèques Java Blockchain telles que Hyperledgerfabric, Web3J ou Corda pour l'ouverture au niveau de la production

Oui, un menu déroulant CSS commun peut être implémenté via Pure HTML et CSS sans JavaScript. 1. Utilisez des ul imbriqués et Li pour construire une structure de menu; 2. Utilisez le: Hover Pseudo-Class pour contr?ler l'affichage et la cachette du contenu déroulant; 3. Position définie: relative pour le parent li, et le sous-menu est positionné en utilisant la position: absolue; 4. Le sous-menu défaut par défaut: Aucun, qui devient affichage: Block lorsqu'il a survolé; 5. Le tir-down à plusieurs niveaux peut être réalisé grace à la nidification, combinée à la transition, et à l'ajout d'animations fondues, et adaptées aux terminaux mobiles avec des requêtes multimédias. La solution entière est simple et ne nécessite pas de prise en charge JavaScript, qui convient au grand

@Property Decorator est utilisé pour convertir les méthodes en propriétés pour implémenter le contr?le de lecture, de réglage et de suppression des propriétés. 1. Utilisation de base: définissez des attributs en lecture seule via @Property, tels que la zone calculée en fonction du rayon et accédé directement; 2. Utilisation avancée: utilisez @ name.setter et @ name.deleter pour implémenter les opérations de vérification et de suppression de l'attribut d'attribut; 3. Application pratique: effectuer la vérification des données dans les setters, tels que BankAccount pour s'assurer que le solde n'est pas négatif; 4. Spécification de dénomination: les variables internes sont préfixées, les noms de méthode de propriété sont cohérents avec les attributs et le contr?le d'accès unifié est utilisé pour améliorer la sécurité et la maintenabilité du code.

Tout d'abord, utilisez JavaScript pour obtenir les préférences du système utilisateur et les paramètres de thème stockés localement et initialiser le thème de la page; 1. La structure HTML contient un bouton pour déclencher la commutation du sujet; 2. CSS utilise: Root pour définir des variables de thème brillantes, la classe de mode. Dark définit les variables de thème sombres et applique ces variables via var (); 3. JavaScript détecte préfère-Color-Scheme et lit LocalStorage pour déterminer le thème initial; 4. Communiquez la classe en mode noir sur l'élément HTML lorsque vous cliquez sur le bouton et enregistre l'état actuel vers LocalStorage; 5. Tous les changements de couleur sont accompagnés d'une animation de transition de 0,3 seconde pour améliorer l'utilisateur

La disposition en plein écran peut être réalisée à l'aide de Flexbox ou de Grid. Le noyau est de faire de la hauteur minimale de la page la hauteur de la fenêtre (mine-hauteur: 100VH); 2. Utilisez Flex: 1 ou Grid-Template Rows: Auto1Frauto pour faire en sorte que la zone de contenu occupe l'espace restant; 3. Définir la dimensionnement de la bo?te: Border-Box pour s'assurer que la marge ne dépasse pas le conteneur; 4. Optimiser l'expérience mobile avec la requête médiatique réactive; Cette solution est compatible avec une bonne structure et convient aux pages de connexion, aux tableaux de bord et à d'autres scénarios, et réalise enfin une disposition de page en plein écran avec centrage vertical et fenêtre complet.
