如何使用 WebClient 使用 React Spring Rest API

How to consume a Reactive Spring Rest API with WebClient

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

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