2017-05-24 67 views
3

我需要在后端作业(可执行jar)上使用反应式rest API(使用spring webflux构建)。如何通过WebClient使用反应式Spring Rest API

我已阅读关于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是被动的,但可能是我没有意识到的。

回答

5

是的,这是必需的。 被动的整个想法是确保线程没有被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)); 

给你一个单引号,它是发布者的引用,可以在将来发出单个值。所以客户端线程不被阻塞。

我已经博客解释这更多。 https://dzone.com/articles/spring-5-reactive-web-services