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