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

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

这是我的问题:

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

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

【问题讨论】:

    标签: spring-boot webclient spring-webflux reactive


    【解决方案1】:

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

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

    【讨论】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2020-08-26
      • 2021-01-08
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多