Spring Boot响应式WebClient调用遗留端点

Posted

技术标签:

【中文标题】Spring Boot响应式WebClient调用遗留端点【英文标题】:Spring boot reactive WebClient calling legacy endpoint 【发布时间】:2020-05-20 16:09:36 【问题描述】:

在 Spring Boot (2.2.2.RELEASE) 应用程序中,我有响应式端点(返回 Mono 或 Flux),每个端点都使用响应式 WebClient 来调用另一个服务。这种“其他”服务是遗留(非反应性)服务。

这是我的问题:

如果我的反应式端点正在调用这个会阻塞的非反应式端点,那么使用 Webflux(反应式 WebClient)有什么好处吗?

我的反应式端点是否仍然反应式?

【问题讨论】:

【参考方案1】:

如果我们谈论的是 HTTP 端点,我们可以使用阻塞或非阻塞(异步)客户端调用它们,但不能完全响应。

如果您的“新”应用程序是响应式的,则必须使用非阻塞客户端(在您的情况下为 WebClient),否则您将阻塞 NIO 线程并失去响应式方法的所有优势。 “其他”应用程序阻塞的事实并不重要,您仍然可以获得资源密集度较低的“新”应用程序。

【讨论】:

是的,端点是 HTTPS,我有一个后续问题。从我调试的反应式 WebClients 共享相同的线程池?所有 WebClient 实例的每个核心都有一个 NIO 线程。在高负载下它们是否可能实际上相互阻塞?守护线程 [reactor-http-nio-1] 你甚至可以只使用一个 WebClient 实例,它是安全的。如果您不调用block() 方法并且不使用链中某处的阻塞api,则可以确定NIO 线程上没有任何阻塞。有BlockHound工具,如果您有疑问,它可以帮助您找到阻塞呼叫。【参考方案2】:

他们是 1. 不完全。 2. 在您更改旧版 API 之前,您的请求不是完全响应式的

解释: 端到端响应式模式仅有助于性能方面 目前您正在使用响应式客户端,这有助于以两种方式通信连接到服务器。 第一组 API 是响应式的,因此 Web 服务器层现在是响应式的,但数据层(旧版 API)不是响应式的

【讨论】:

以上是关于Spring Boot响应式WebClient调用遗留端点的主要内容,如果未能解决你的问题,请参考以下文章

Spring WebClient与RestTemplate性能对比——响应式Spring的道法

使用 Spring Boot 2 WebClient 从响应中获取标头

Spring Boot 自动配置的 Jackson ObjectMapper 默认不用于 WebFlux WebClient

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

如何在 Spring 响应式 WebClient 中返回 Kotlin Coroutines Flow

如何在运行在 Tomcat 上的 Spring Web 应用程序中使用 Spring 的响应式 WebClient