Comment consommer une API Spring Rest réactive avec WebClient

j'ai besoin de consommer une API rest réactive (construite avec spring webflux) sur une tâche de backend (JAR exécutable).

j'ai lu à propos de Spring WebClient, mais je ne comprends pas certains points.

Par exemple:

WebClient webClient = WebClient.create("http://localhost:8080");

Mono<Person> person = webClient.get()
        .uri("/persons/{id}", 42)
        .accept(MediaType.APPLICATION_JSON)
        .exchange()
        .then(response -> response.bodyToMono(Person.class));

sur la dernière ligne, il y a un"bodyToMono". Donc ma question:

si L'API Rest appelée est déjà un service réactif, dois-je transformer la réponse en un mono? Est-il un point que je suis manquant?

de mon point de vue, je pense que je pourrais avoir un moyen de laisser explicite dans le code que mon API Rest est réactive, mais c'est probablement quelque chose dont je ne suis pas au courant.

9
demandé sur Igor Veloso 2017-05-24 18:39:13

1 réponses

Oui, c'est nécessaire. L'idée d'être réactif est de s'assurer qu'aucun fil ne soit bloqué pour IO.

vous avez peut-être rendu votre service Côté Serveur réactif, mais lorsque vous consommez que ce qui est l'avantage que vous obtenez lorsque votre client est bloqué jusqu'à ce qu'il ya une réponse du serveur. Votre thread client attend jusqu'à ce que le serveur réponde. Ce qui n'est pas souhaité.

webClient.get()
        .uri("/persons/{id}", 42)
        .accept(MediaType.APPLICATION_JSON)
        .exchange().block()

bloquera votre thread client actuel pour attendre que le serveur réponde. Ce peut bloquer votre fil client.

webClient.get()
        .uri("/persons/{id}", 42)
        .accept(MediaType.APPLICATION_JSON)
        .exchange()
        .then(response -> response.bodyToMono(Person.class));

vous Donne un Mono qui est une référence à un éditeur qui peut émettre une seule valeur dans le futur. Le fil client n'est donc pas bloqué.

j'ai blogué pour expliquer plus. https://dzone.com/articles/spring-5-reactive-web-services

9
répondu Praneeth Ramesh 2017-05-24 15:49:38