Skip to content
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

Article/programation reactive #117

Open
wants to merge 29 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
bfcce68
commit article about reactive programming
khairouch Nov 27, 2024
0bd8779
modify design article and add conclusion
khairouch Nov 27, 2024
35954c3
modify design article
khairouch Nov 27, 2024
a801e7c
modify design article
khairouch Nov 27, 2024
d35d23a
modify design article
khairouch Nov 27, 2024
bff319f
modify design article
khairouch Nov 27, 2024
4e48fa5
modify design article
khairouch Nov 27, 2024
40f8bcb
modify design article
khairouch Nov 27, 2024
ea0822c
modify design article
khairouch Nov 27, 2024
2e62e3b
modify design article
khairouch Nov 27, 2024
a66f387
modify introduction
khairouch Nov 27, 2024
de6289a
modify design article
khairouch Nov 27, 2024
eebacda
add tags for article and add many suggestions
khairouch Nov 28, 2024
f6b15cb
ajout inconvénients et modifier conclusion
khairouch Nov 29, 2024
e29317a
indentation code
khairouch Nov 29, 2024
5af4651
indentation code
khairouch Nov 29, 2024
b93b86c
modify conclusion
khairouch Nov 29, 2024
e99a5dd
add suggestion
khairouch Nov 29, 2024
7e3f80a
modify introduction
khairouch Nov 29, 2024
72d16c1
add suggestion
khairouch Nov 29, 2024
667e85a
add discription to code
khairouch Dec 1, 2024
73964eb
add suggestion
khairouch Dec 5, 2024
2728e1e
add suggestion
khairouch Dec 5, 2024
6cf9ae9
Update _posts/2024-11-23-programation-reactive.adoc
khadraoui Dec 23, 2024
cd31414
Update _posts/2024-11-23-programation-reactive.adoc
khadraoui Dec 23, 2024
bc7dc6d
Update _posts/2024-11-23-programation-reactive.adoc
khadraoui Dec 23, 2024
5e9545c
Update _posts/2024-11-23-programation-reactive.adoc
khadraoui Dec 23, 2024
a59dfc5
Update _posts/2024-11-23-programation-reactive.adoc
khadraoui Dec 23, 2024
946323e
Update _posts/2024-11-23-programation-reactive.adoc
khadraoui Dec 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion _data/authors.yml
Original file line number Diff line number Diff line change
Expand Up @@ -253,4 +253,19 @@ Passionné de sport, il aime tout particulièrement le volley qu'il a pratiqué
pagesciam: "https://www.sciam.fr/equipe/chaker-fezai"
picture: chakerfezai.jpg
socials:
linkedin: "chaker-fezai-31436318"
linkedin: "chaker-fezai-31436318"

khairikhadhraoui:
name: "Khairi Khadhraoui"
bio: "Diplômé en 2015 d’un diplôme d’ingénieur en spécialité système d’information à l’école polytechnique centrale de Tunis.

khadraoui marked this conversation as resolved.
Show resolved Hide resolved
Khairi a travaillé sur plusieurs projets au cours de ces dernier 8 ans principalement dans le secteur de télécommunication, bancaire et finance

khadraoui marked this conversation as resolved.
Show resolved Hide resolved
Khairi est passionné par les nouvelles technologiques spécialement au développement des application web.

khadraoui marked this conversation as resolved.
Show resolved Hide resolved
Ces centres d’intérêt se tourne principalement sur les randonné, les voyage et tous ce qui est lié à la nature."
job: "Consultant Technique Senior"
pagesciam: "https://www.sciam.fr/equipe/khairi-khadhraoui"
khadraoui marked this conversation as resolved.
Show resolved Hide resolved
picture: khairikhadfhraoui.jpg
socials:
khadraoui marked this conversation as resolved.
Show resolved Hide resolved
linkedin: "https://www.linkedin.com/in/khadhraoui-khairi-21940084/"
189 changes: 189 additions & 0 deletions _posts/2024-11-23-programation-reactive.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
= La programmation réactive avec Reactor Spring web Flux
khadraoui marked this conversation as resolved.
Show resolved Hide resolved
:showtitle:
:page-navtitle: La programmation réactive avec Reactor Spring web Flux
khadraoui marked this conversation as resolved.
Show resolved Hide resolved
:page-excerpt:
khadraoui marked this conversation as resolved.
Show resolved Hide resolved
:layout: post
:author: khairikhadhraoui
:page-tags:
khadraoui marked this conversation as resolved.
Show resolved Hide resolved
:page-vignette: programation-reactive.jpg
khadraoui marked this conversation as resolved.
Show resolved Hide resolved
:page-liquid:
:page-categories: software news

== Introduction:
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Pendant longtemps, la programmation Java a été dominée par un modèle synchrone et bloquant. Cependant, l'évolution des architectures logicielles, notamment l'émergence des microservices et du cloud computing, a mis en évidence les limites de ce modèle. Pour répondre à ces nouveaux défis, un nouveau paradigme a vu le jour : la programmation réactive en s'appuyant sur le Reactive Manifesto, offre une solution robuste et performante pour mettre en œuvre des applications réactives en Java.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

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 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.
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,
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* 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
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* 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.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* 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
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Pour surmonter ces limitations, les systèmes réactifs offrent une alternative en se concentrant sur l'asynchronisme, la non-bloquante, 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.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

== Principes programmation réactive
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

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.
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.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* 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.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Elastic (Élastique) : Les systèmes réactifs s'adaptent aux variations de la charge de travail en allouant dynamiquement les ressources nécessaires.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Message-Driven (Basé sur les Messages) : Les systèmes réactifs communiquent par la transmission de messages asynchrones, facilitant la déconnexion et le découplage des composants.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

== Standard de la programmation réactive
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Les standards de la programmation réactive sont basés sur deux modèles{nbsp}:

* ReactiveX: ReactiveX à é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.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* 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. Ces implementation connues sont Akka Reactor Vertex et RxJAVA2
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Dans notre article, on va s'intéresser à Reactor qui est une implémentation de Reactive streams.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Les objectifs principaux de Reactive Streams sont {nbsp}:
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Asynchronisme : Gérer les flux de données de manière non bloquante et asynchrone.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Backpressure : Introduire une rétropression pour permettre aux consommateurs de signaler aux producteurs leur capacité à traiter les données, évitant ainsi les surcharges.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Interopérabilité : Fournir une interface standard pour que différentes bibliothèques réactives puissent fonctionner ensemble.
Copy link
Contributor

Choose a reason for hiding this comment

The 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.
* Interopérabilité : fournir une interface standard pour que différentes bibliothèques réactives puissent fonctionner ensemble.


Interfaces principales de Reactive Streams {nbsp}:
khadraoui marked this conversation as resolved.
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.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Subscriber<T> : Représente un consommateur de données. Il reçoit les éléments émis par un Publisher via quatre méthodes : onSubscribe(), onNext(), onError(), et onComplete().
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* 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()).
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* 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.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

== Project Reactor :
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

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 construire des applications non bloquantes, asynchrones, et scalables. Reactor est au cœur de Spring WebFlux, le module réactif de Spring Framework.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Les principales abstractions fournies par Reactor sont {nbsp}:
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Mono<T> : Représente un flux réactif qui produit au maximum une seule valeur ou une erreur.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Flux<T> : Représente un flux réactif qui peut émettre zéro, une ou plusieurs valeurs, voire un flux infini.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

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}:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
En pratique un Flux peut être sérialisé sous plusieur formes {nbsp}:
En pratique un `Flux` peut être sérialisé sous plusieurs formes{nbsp}:

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ne faudrait il pas préciser des type mimes pour chaque forme ??


* Json Array : retourne un arrayList normale
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Text Event Stream : envoie un flux d'objets Json contenue donnés par donne dès qu’ils sont disponible.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Flux de json stream : De la même manière entre deux serveurs on peut avoir un flux de json Stream.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

== Spring Web Flux avec Reactor

Spring web flux fait partie de projet Spring 5 c'est un module Spring basé sur une api http exposé à la source sur reactive Streams. dans lequel on continue à utiliser les mêmes annotation du contrôleurs Spring MVC (@conttreler, @RequestMapping, etc.) sauf que au lieu d'utiliser des type de retour List<T>, T ou void, on utilise Flux<T> ou Mono<T>.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

=== Composants de Spring WebFlux {nbsp}:
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Copy link
Contributor

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 : "

* Contrôleurs Réactifs : Comme dans Spring MVC, mais avec des types réactifs comme Mono et Flux.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* WebClient : Un client HTTP non-bloquant qui remplace RestTemplate pour les appels externes réactifs.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Router Function : Une approche fonctionnelle pour définir des routes HTTP.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

==== Avantages{nbsp}:
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Copy link
Contributor

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 : "

* Scalabilité : La nature non-bloquante permet de gérer un grand nombre de connexions simultanées avec moins de threads.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* Scalabilité : La nature non-bloquante permet de gérer un grand nombre de connexions simultanées avec moins de threads.
* Scalabilité : la nature non-bloquante permet de gérer un grand nombre de connexions simultanées avec moins de threads.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

il y a tout même un gros bémol pour que cela soit vraie dont tu ne parles pas


* Performance : Idéal pour les applications nécessitant une faible latence et une haute performance.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

* Flexibilité : Peut être utilisé pour des microservices, des applications Web, ou même des applications fonctionnant avec d'autres paradigmes réactifs comme RxJava.

khadraoui marked this conversation as resolved.
Show resolved Hide resolved
Configuration d'un projet Spring WebFlux
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

== Configuration Maven :
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Pour configurer un projet Maven avec Spring WebFlux et Reactor, il est essentiel d'ajouter les dépendances appropriées dans le fichier pom.xml. Voici les étapes à suivre pour inclure ces dépendances.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved
[source,plain]
----
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectreactor/reactor-spring -->
<dependency>
<groupId>org.projectreactor</groupId>
<artifactId>reactor-spring</artifactId>
<version>1.0.1.RELEASE</version>
</dependency>
----

=== Création d'un contrôleur réactif:
khadraoui marked this conversation as resolved.
Show resolved Hide resolved


[source,java]
----
khadraoui marked this conversation as resolved.
Show resolved Hide resolved
@RestController

public class ReactiveController {
@GetMapping("/hello")
khadraoui marked this conversation as resolved.
Show resolved Hide resolved
public Mono<String> sayHello() {
return Mono.just("Hello, WebFlux!");
}

@GetMapping("/numbers")
public Flux<Integer> getNumbers() {
return Flux.range(1, 10) .delayElements(Duration.ofMillis(100));
}
}
----

=== Exemple d'utilisation de WebClient :
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Copy link
Contributor

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 ?

[source,java]
----
khadraoui marked this conversation as resolved.
Show resolved Hide resolved
public class WebClientExample {
private final WebClient webClient =WebClient.create("http://example.com");
public Mono<String> fetchData() {
return webClient.get() .uri("/api/data") .retrieve()
.bodyToMono(String.class);
}
}
----

=== Gestion du Backpressure
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Le backpressure est une composante essentielle dans les systèmes réactifs pour gérer le flux de données entre les producteurs et les consommateurs. Avec Reactor, vous pouvez contrôler le backpressure via des opérateurs comme limitRate.
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Exemple d'utilisation de limitRate pour réguler la consommation des données :
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

[source,java]
----
khadraoui marked this conversation as resolved.
Show resolved Hide resolved

Flux<Integer> flux = WebClient.create("http://example.com")
.get()
.uri("/api/large-stream")
.retrieve() .bodyToFlux(Integer.class)
.limitRate(5);
flux.subscribe(data -> { // Traitement des données
System.out.println("Received: " + data);
});

----

== Conclusion

Spring Reactor propulse le développement d'applications modernes vers de nouveaux sommets en leur conférant réactivité, performance et résilience. En s'alignant sur le Reactive Manifesto, cette technologie ouvre la voie à des systèmes distribués agiles et efficaces. Toutefois, son adoption requiert une solide compréhension des concepts fondamentaux et une évaluation minutieuse des besoins spécifiques de chaque projet.

Face à l'évolution rapide des architectures modernes (cloud, microservices, événements), la programmation réactive s'impose comme une approche incontournable. Il est passionnant d'envisager les prochaines avancées dans ce domaine et d'imaginer les nouveaux outils qui transformeront encore davantage notre façon de concevoir des systèmes réactifs.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ils sont déjà là (en Java : thread virtuels et structured concurrency (en preview)) mais pour remplacer la programmation réactive qui a de très gros défauts.
Sans en avoir un bonne connaissance, c'est la garantie de plus d'ennuis que de gain sur la mise en oeuvre (ce qui est fréquemment le cas).
Pour apporter un peu plus de valeur à cette article, il faudrait ajouter une partie à ce sujet.

Binary file added images/authors/khairikhadhraoui.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/khairi/programation-reactive.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading