Webservice Réactif avec Spring Boot 2 et Reactor 3

Voici un petit article pour gérer Reactor 3 via une connexion serveur. J’ai déjà parlé de Reactor 3 via plusieurs exemples dans cet article.
On va utiliser Spring Boot 2 qui s’appuie naturellement sur la bibliothèque Reactor 3 pour mettre en place notre appel client-serveur reactif avec architecture REST.

Le code

Le code se trouve sur ce repository.

Rapide Récap’

Le principe du développement réactive permet lancer un processus d’un objet observé (un Publisher pour Reactor 3) quand un object observateur (un Subscriber pour Reactor 3) le demande. C’est entièrement asynchrone dans son propre thread.
Pour plus d’info sur la bibliothèque Reactor 3, allez voir le site officiel.

Dépendances Maven

J’ai créé deux modules maven: Le serveur “server” et le client “client”. Ces deux projets ont les mêmes dépendances Spring via un module parent. Afin d’utiliser Reactor 3 dans Spring, il faut ajouter la dépendance “spring-boot-starter-webflux” dans le pom.xml.

Partie Serveur

On va mettre en place un service web basé sur un flux de Reactor 3. Regarde la classe “Controller” dans le module serveur, c’est un controller REST Spring.

@RestController
public class Controller {

    @GetMapping(path = "/test", produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
    public Flux<Integer> flux() {
        return Flux.just(8, 7, 6, 5, 4, 3, 2, 1).zipWith(Flux.interval(Duration.ofMillis(500)), (integer, aLong) -> integer);
    }

}

On crée un service “test” en lui précisant que l’on désire retourner (ou produire) du Json en streaming. Une source streaming est parfaite pour un flux, on va lui donner progressivement de la donnée. J’ai fait comme exemple de flux simple: Le serveur affiche des chiffres de 8 à 1 toutes 500 millisecondes.

Pour tester, lance le serveur via la classe “SpringApplicationRunner” et regarde l’url “http://localhost:8080/test” sur un navigateur web des que le serveur est lancé.  Le flux se lance, le navigateur joue le role de Subscriber, affichant les valeurs réponses dès qu’elles sont disponibles.

Partie client

On va récupérer ce flux via du code Java. J’utilise l’object WebClient, le nouveau client web réactif de Spring 5. Il y a une super doc qui explique bien toutes les fonctionnalités d’un WebClient.

Flux<String> flux = WebClient.create("http://localhost:8080/test")
	.get()
	.retrieve()
	.bodyToFlux(String.class);
Disposable disposable = flux.subscribe(body -> System.out.println("body -> " + body));
while (!disposable.isDisposed()) {
	Thread.sleep(1000);
}

La fonction “retrieve” définit comment lire la réponse du flux.  Via cette méthode, on n’a pas besoin d’attendre la réponse http complète du flux avant de traiter la réponse (contrairement à la fonction “exchange”, je te laisse tester la différence …)

La fonction “bodyToFlux” reconvertit ce client web en un flux Reactor 3 à traiter. On retrouve donc la fonction “subscribe” du flux. L’appel vers le serveur se fera uniquement quand la fonction “subscribe” est exécutée.

Lance le client quand le serveur tourne afin de tester le tout. On retrouve notre flux s’afficher progressivement sur la console de notre client. Si ça, ce n’est pas le bonheur …

Conclusion

Voila, si tu as des questions, n’hésitez pas à les envoyer.

 

Leave a Reply

Your email address will not be published. Required fields are marked *