Spring WebClient 与 RestTemplate 比较

Spring RestTemplate

RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。
长期以来,Spring 一直把 RestTemplate 作为默认 Web 客户端。RestTemplate 使用 Java Servlet API,这种模型在底层会为每个请求分配处理线程。
这意味着线程会一直保持阻塞,直到 Web 客户端收到响应。阻塞式模型的问题在于每个线程都会消耗大量内存和 CPU 资源。
让我们考虑这样的情况:系统收到大批请求时,等待某些服务返回结果,而这些服务本身执行缓慢。
结果,等待的请求会发生堆积。应用程序将创建许多线程,耗尽线程池并占掉所有可用内存。还可能因为 CPU 上下文(线程)频繁切换导致性能下降

WebClient

另一种 WebClient 方案,利用 Spring Reactive 框架提供异步、非阻塞式解决方案。

RestTemplate 为每个事件(HTTP 调用)创建一个新线程,而 WebClient 为每个事件创建类似task 的结构。Reactive 框架会在后台对这些 task 进行排队,且只在响应结果就绪后才开始执行。
Reactive 框架采用事件驱动,通过Reactive Streams API 实现异步逻辑。相比同步阻塞式调用,Reactive 方法用更少的线程和系统资源处理了更多业务逻辑。
Webclient 是 Spring WebFlux 开发库的一部分。因此,写客户端代码时,还可以应用函数式编程与流式 API,支持 Reactive 类型(Mono 和 Flux)。

总结

RestTemplate 采用 Java Servlet API,因而是阻塞式同步调用。相反,WebClient 是异步的,等待响应的同时不会阻塞正在执行的线程。只有在响应结果准备就绪时,才会发起通知。

RestTemplate 仍然有用武之地。非阻塞模式在某些场景下比阻塞方法占用系统资源要少得多,这时 WebClient 是一种更好的选择

参考文章:https://blog.csdn.net/u012717638/article/details/100075790

你可能感兴趣的:(Spring,spring,java,后端)