如何使用WebClient使用Reactive Spring Rest API

时间:2017-05-24 15:39:13

标签: spring rest spring-mvc reactive-programming spring-webflux

我需要在后端作业(可执行jar)上使用反应式rest API(使用spring webflux构建)。

我读过有关Spring WebClient的内容,但我不了解一些观点。

例如:

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));

在最后一行,有一个“bodyToMono”。这是我的问题:

如果被调用的Rest API已经是一个被动服务,我是否需要将响应转换为单声道?是否有一点我错过了?

从我的角度来看,我认为可以在代码中明确表示我的Rest API是被动的,但可能是我不知道的。

1 个答案:

答案 0 :(得分:10)

是的,这是必需的。 被动反应的整个想法是确保没有任何线程被IO阻止。

您可能已经使服务器端服务处于被动状态,但是当您消费时,在客户端被阻止时获得的好处是什么,直到服务器有响应。您的客户端线程一直等待,直到服务器响应。这是不可取的。

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

将阻止当前客户端线程等待服务器响应。这可能会阻止您的客户端线程。

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

为您提供一个Mono,它是对将来可以发出单个值的发布者的引用。所以客户端线程没有被阻止。

我已经在博客上解释了这一点。 https://dzone.com/articles/spring-5-reactive-web-services