spring - 如何使用 WebClient 使用响应式 Spring Rest API

标签 spring rest spring-mvc reactive-programming spring-webflux

我需要在后端作业(可执行 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/

相关文章:

java - @Cacheable 杀死 Hibernate Session?

java - 登录后重定向到自定义网址

node.js - 如何在nodejs中创建ip别名

java - 如果浏览器关闭或断电,是否可以使 spring mvc session 无效?

java - 如何对具有对象的 RequestParam 的 Controller 方法进行单元测试?

java - Spring Boot - REST 和 SOAP 组合

java - JAX-RS 与 Jersey 2.22.2 + Tomcat 7.0.59 : The requested resource is not available

java - Spring表达式语言的具体使用

java - 重定向时未找到带有 URI 的 HTTP 请求的映射

java - 无法构造 `class name` 的实例(尽管至少在 Creator 上存在)