Spring Reactor WebClient如何实现非阻塞?

时间:2018-08-15 03:39:43

标签: spring-webflux project-reactor reactor-netty

基本问题:与RestTemplate相比,Spring Reactors WebClient如何实现非阻塞?在将请求分派给外部服务之后,它是否不必在某处阻塞? HTTP本质上是同步的,对吗?因此,调用应用程序必须等待响应? 线程如何知道上下文以对服务的响应做出反应?

1 个答案:

答案 0 :(得分:2)

这里有几个单独的问题。

  • 如何管理I / O操作?
  • 此运行时背后的线程模型是什么?
  • 应用程序如何处理HTTP背后的请求/响应模型?

对于WebClient和项目Reactor,Netty事件循环用于对事件进行排队/调度/处理。每个读/写操作都是以非阻塞方式完成的,这意味着没有线程在等待I / O操作完成。在此模型中,并发不是通过线程池完成的,但是有少量线程处理工作单元,这些线程永远都不会阻塞。

从纯粹的HTTP角度(即,如果您正在捕获网络上的HTTP数据包),您将发现RestTemplateWebClient调用之间没有太大区别。 HTTP传输本身不支持背压概念。因此,客户端仍然必须等待响应-区别在于使用WebClient的应用程序不会在等待该操作完成时浪费资源-它将使用它们来处理其他事件。

有关更多信息,请查看the reactive programming introduction in the Reactor reference documentationthis talk given by Rossen Stoyanchev that explains things well if you're used to the typical Servlet container model