-
Notifications
You must be signed in to change notification settings - Fork 4
Article/programation reactive #117
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 21 commits
bfcce68
0bd8779
35954c3
a801e7c
d35d23a
bff319f
4e48fa5
40f8bcb
ea0822c
2e62e3b
a66f387
de6289a
eebacda
f6b15cb
e29317a
5af4651
b93b86c
e99a5dd
7e3f80a
72d16c1
667e85a
73964eb
2728e1e
6cf9ae9
cd31414
bc7dc6d
5e9545c
a59dfc5
946323e
d1754b6
57e2808
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,233 @@ | ||||||
| = La programmation réactive avec Reactor et Spring Web Flux | ||||||
| :showtitle: | ||||||
| :page-navtitle: La programmation réactive avec Reactor et Spring Web Flux | ||||||
| :page-excerpt: ce article decrit les notion de la programation non bloquante avec Reactor et spring Web Flux | ||||||
| :layout: post | ||||||
| :author: khairikhadhraoui | ||||||
| :page-tags: [java, Spring webFlux, reactor, reactive programming, programation non bloquante, ReactiveX, Reactive Streams ] | ||||||
| :page-vignette: programation-reactive.jpg | ||||||
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
| :page-liquid: | ||||||
| :page-categories: software news | ||||||
|
|
||||||
| == Introduction : | ||||||
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
|
|
||||||
| L'évolution rapide des architectures logicielles vers des modèles distribués (microservices) et cloud-native a révélé les contraintes | ||||||
| inhérentes à la programmation bloquante traditionnelle. Pour répondre à ces nouveaux défis, la programmation réactive, fondée sur les | ||||||
| principes du Reactive Manifesto, propose un paradigme plus adapté pour concevoir et développer des applications Java hautement réactives, | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| capables de s'adapter aux fluctuations de charge et de garantir une faible latence. | ||||||
|
|
||||||
| Pour explorer la programmation réactive, il est utile de comprendre les systèmes non réactifs traditionnels et leurs inconvénients, | ||||||
| en particulier en ce qui concerne l'utilisation des ressources et la gestion des événements. | ||||||
|
|
||||||
| Les systèmes non réactifs, aussi appelés systèmes synchrones ou bloquants, sont les approches traditionnelles utilisées dans la | ||||||
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
| programmation. Voici quelques caractéristiques clés{nbsp}: | ||||||
|
|
||||||
|
|
||||||
| * Traitement séquentiel : une tâche doit généralement attendre la fin de l'exécution de la tâche précédente avant de commencer, | ||||||
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
|
|
||||||
| * Blocage des ressources : les systèmes non réactifs bloquent souvent des ressources (comme des threads ou des connexions réseau) en attendant des résultats, | ||||||
|
||||||
|
|
||||||
| * Gestion des événements complexes : la gestion des événements dans les systèmes non réactifs peut devenir complexe et difficile à maintenir, surtout lorsque le nombre d'événements augmente | ||||||
|
|
||||||
| * Latence élevée : en raison de la nature bloquante de ces systèmes, ils peuvent entraîner une latence élevée, surtout dans les applications où la rapidité de réponse est cruciale | ||||||
|
|
||||||
| * Scalabilité limitée : comme chaque requête ou tâche peut nécessiter son propre thread ou processus, l'augmentation du nombre de requêtes peut rapidement saturer les ressources du système | ||||||
|
|
||||||
| Pour surmonter ces limitations, les systèmes réactifs offrent une alternative en se concentrant sur l'asynchronisme, non-bloquant, et l'efficacité dans l'utilisation | ||||||
| des ressources. Ils permettent de créer des applications qui sont plus réactives, plus résilientes, et plus scalables, en répondant efficacement aux événements et en | ||||||
| utilisant les ressources de manière optimale. | ||||||
|
|
||||||
| == Les principes de la programmation réactive | ||||||
|
|
||||||
| Les principes de la programmation réactive sont encapsulés dans le "Manifeste Réactif", qui énonce quatre caractéristiques clés{nbsp}: | ||||||
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
|
|
||||||
| * Responsive (Réactif) : les systèmes réactifs répondent rapidement aux utilisateurs pour garantir une expérience fluide et interactive. | ||||||
|
|
||||||
| * Resilient (Résilient) : les systèmes réactifs restent opérationnels même en cas de défaillance, grâce à des mécanismes de gestion des erreurs et de redondance. | ||||||
|
|
||||||
| * Elastic (Élastique) : les systèmes réactifs s'adaptent aux variations de la charge de travail en allouant dynamiquement les ressources nécessaires. | ||||||
|
|
||||||
| * Message-Driven (Basé sur les Messages) : les systèmes réactifs communiquent par la transmission de messages asynchrones, facilitant la connexion et le découplage des composants. | ||||||
|
|
||||||
| == Les bibliotheques de la programmation réactive sont basés sur deux modèles{nbsp}: | ||||||
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
|
|
||||||
| * ReactiveX : ReactiveX a été conçu pour fournir une API unifiée pour le traitement de collections asynchrones, en s'inspirant des méthodes | ||||||
| des collections synchrones (comme map, filter, reduce). Il est souvent utilisé pour gérer des événements utilisateur, des requêtes | ||||||
| réseau, et d'autres opérations asynchrones dans des applications interactives. Ces implémentations connues sont : RxJava et RxJs. | ||||||
|
|
||||||
| * Reactive Streams : Reactive Streams a été créé pour résoudre des problèmes spécifiques de backpressure dans les systèmes de traitement | ||||||
| de données asynchrones, en définissant un ensemble minimal d'interfaces pour garantir une gestion cohérente et efficace des flux de données | ||||||
| entre différentes bibliothèques réactives dans l'écosystème JVM. Les implémentations connues sont Akka, Reactor, Vert.x et RxJAVA2. | ||||||
khadraoui marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
|
||||||
| Dans cet article, on va s'intéresser à Reactor qui est une implémentation de Reactive streams. | ||||||
|
|
||||||
| Les objectifs principaux de Reactive Streams sont {nbsp}: | ||||||
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
|
|
||||||
| * Asynchronisme : gérer les flux de données de manière non bloquante et asynchrone. | ||||||
|
|
||||||
| * Backpressure :S'assurer du nombre d'éléments que le consommateur peut recevoir, évitant ainsi les surcharges. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| * Interopérabilité : Fournir une interface standard pour que différentes bibliothèques réactives puissent fonctionner ensemble. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| Les principales interfaces de Reactive Streams sont{nbsp}: | ||||||
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
|
|
||||||
| * `Publisher<T>` : représente une source qui peut émettre une séquence de valeurs asynchrones. Les éditeurs appellent la méthode `subscribe()` pour permettre aux abonnés de recevoir les éléments. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "Les éditeurs" ??? |
||||||
|
|
||||||
| * `Subscriber<T>` : représente un consommateur de données. Il reçoit les éléments émis par le producteur 'Publisher' via la méthode : onSubscribe(). | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Le rôle de la méthode onSubscribe() n'est pas de recevoir des éléments, c'est le rôle de la méthode onNext(). |
||||||
|
|
||||||
| * `Subscription` : gère le lien entre un `Publisher` et un `Subscriber`. Elle permet de demander des éléments (`request(long n)`) ou d'annuler la souscription (`cancel()`). | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. La méthode request(long) ne permet pas demander des éléments |
||||||
|
|
||||||
| * `Processor<T, R>` : combine les fonctionnalités d'un 'Publisher' et d'un 'Subscriber'. Un 'Processor' reçoit des éléments, les traite, et les renvoie sous forme d'un autre flux. | ||||||
|
|
||||||
| == Le Project Reactor : | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| Reactor est une bibliothèque réactive pour Java développée par Pivotal (maintenant VMware) et intégrée dans l'écosystème Spring. Elle fournit une implémentation de Reactive Streams et permet de | ||||||
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
| construire des applications non bloquantes, asynchrones, et scalables. Reactor est au cœur de Spring WebFlux, le module réactif Web de Spring Framework. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| Les principales abstractions fournies par Reactor sont {nbsp}: | ||||||
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
|
|
||||||
| * 'Mono<T>' : représente un flux réactif qui produit au maximum une seule valeur. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| * 'Flux<T>' : représente un flux réactif qui peut émettre zéro, une ou plusieurs valeurs, voire un flux infini. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| Ces deux types sont les composants de base utilisés pour modéliser des flux de données asynchrones en Java avec Reactor. | ||||||
|
|
||||||
| En pratique un 'Flux' peut être sérialisé sous plusieur formes{nbsp}: | ||||||
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
| En pratique un 'Flux' peut être sérialisé sous plusieur formes{nbsp}: | |
| En pratique un `Flux` peut être sérialisé sous plusieurs formes{nbsp}: |
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
il faudrait ajouter une petite phrase du genre : "Spring WebFlux propose plusieurs fonctionnalités principales : "
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| ==== Les avantages{nbsp}: | |
| ==== Les avantages |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Il faudrait ajouter une phrase du genre "L'utilisation de Spring WebFlux présente plusieurs avantages : "
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je n'aime pas les sections vides
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| Nous allons utiliser un contrôleur contient deux méthodes : | |
| Nous allons utiliser un contrôleur qui contient deux méthodes : |
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| Si un client appelle l'API /numbers, il recevra chaque nombre (de 1 à 10) avec un intervalle de 100 millisecondes entre eux. | |
| Si un client appelle l'API `/numbers`, il recevra chaque nombre (de 1 à 10) avec un intervalle de 100 millisecondes entre eux. |
khadraoui marked this conversation as resolved.
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Que se passe t-il en cas d'erreur ? comment gérer une erreur ?
khadraoui marked this conversation as resolved.
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
khadraoui marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cette tournure ne me semble pas "d'origine humaine" car beaucoup trop pompeuse. Pourrais tu la reformuler de manière plus sobre ?
Uh oh!
There was an error while loading. Please reload this page.