我需要在后端作业(可执行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是被动的,但可能是我不知道的。
答案 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