基本问题:与RestTemplate相比,Spring Reactors WebClient如何实现非阻塞?在将请求分派给外部服务之后,它是否不必在某处阻塞? HTTP本质上是同步的,对吗?因此,调用应用程序必须等待响应? 线程如何知道上下文以对服务的响应做出反应?
答案 0 :(得分:2)
这里有几个单独的问题。
对于WebClient
和项目Reactor,Netty事件循环用于对事件进行排队/调度/处理。每个读/写操作都是以非阻塞方式完成的,这意味着没有线程在等待I / O操作完成。在此模型中,并发不是通过线程池完成的,但是有少量线程处理工作单元,这些线程永远都不会阻塞。
从纯粹的HTTP角度(即,如果您正在捕获网络上的HTTP数据包),您将发现RestTemplate
和WebClient
调用之间没有太大区别。 HTTP传输本身不支持背压概念。因此,客户端仍然必须等待响应-区别在于使用WebClient
的应用程序不会在等待该操作完成时浪费资源-它将使用它们来处理其他事件。
有关更多信息,请查看the reactive programming introduction in the Reactor reference documentation和this talk given by Rossen Stoyanchev that explains things well if you're used to the typical Servlet container model。