基本问题:与 RestTemplate 相比,Spring Reactors WebClient 如何实现非阻塞?在将请求发送到外部服务(例如)之后,它是否不必阻塞某处?HTTP本质上是同步的,对吗?所以调用应用程序必须等待响应?线程如何知道上下文以对服务的响应做出反应?
问问题
2222 次
1 回答
4
这里有几个单独的问题。
- 如何管理 I/O 操作?
- 这个运行时背后的线程模型是什么?
- 应用程序如何处理 HTTP 背后的请求/响应模型?
在WebClient
Reactor 项目的情况下,Netty 事件循环用于排队/调度/处理事件。每个读/写操作都是以非阻塞方式完成的,这意味着没有线程等待 I/O 操作完成。在这个模型中,并发不是通过线程池完成的,但是有少量线程处理永远不应该阻塞的工作单元。
RestTemplate
从纯 HTTP 的角度来看(即,如果您在网络上捕获 HTTP 数据包),您会发现 a和WebClient
call之间没有太大区别。HTTP 传输本身不支持背压概念。所以客户端仍然必须等待响应——这里的区别是应用程序使用它WebClient
不会浪费资源等待该操作完成——它将使用它们来处理其他事件。
有关这方面的更多信息,请查看Reactor 参考文档中的反应式编程介绍以及Rossen Stoyanchev 给出的这个演讲,如果您习惯了典型的 Servlet 容器模型,它会很好地解释事情。
于 2018-08-17T19:44:49.423 回答