12

我需要在后端作业(可执行 jar)上使用反应性休息 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 是反应式的,但可能是我不知道的事情。

4

1 回答 1

13

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

于 2017-05-24T15:49:38.623 回答