我需要在后端作业(可执行 jar)上使用响应式(Reactive)休息 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 是响应式的,但可能是我不知道的。
最佳答案
是的,它是必需的。 响应式的整个想法是确保没有一个线程被 IO 阻塞。
您可能已经使服务器端服务 react 了,但是当您使用该服务时,当您的客户端被阻止直到服务器做出响应时,您将获得什么好处。您的客户端线程一直等待,直到服务器响应。这是不希望的。
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
关于spring - 如何使用 WebClient 使用响应式 Spring Rest API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44162940/