66

根据春季5:

WebClient 是一个接口,表示执行 Web 请求的主要入口点。

它是作为 Spring Web Reactive 模块的一部分创建的,将在这些场景中替换经典的 RestTemplate。新客户端是一个响应式、非阻塞的解决方案,通过 HTTP/1.1 协议工作

这是否意味着,如果我们想升级到 Spring 5,我们需要使用 RestTemplate 为旧应用程序重新编码?

或者有一些解决方法可以在 Spring 5 中使用 RestTemplate?

4

5 回答 5

89

不,RestTemplate 将继续存在(至少目前如此)。您不必用 WebClient 替换它。
主要区别之一是 RestTemplate 是同步和阻塞的,即当您进行休息调用时,您需要等到响应返回才能继续进行。

但是 WebClient 与此完全相反。调用者无需等到响应返回。相反,当有回应时,他会收到通知。

如果您需要这样的功能,那么是的,您需要用 WebClient 替换您的 Resttemplate。
实际上,您可以使用.block(). 但其他方式是不可能的。

编辑:

RestTemplate 将在未来的版本(> 5.0)中被弃用,并且不会增加主要的新功能

于 2017-12-26T07:33:27.127 回答
51

根据Java Doc,RestTemplate 将处于维护模式。Spring 团队建议尽可能使用 WebClient:

注意:从 5.0 开始,非阻塞、反应式 org.springframework.web.reactive.client.WebClient 提供了 RestTemplate 的现代替代方案,有效支持同步和异步以及流场景。RestTemplate 将在未来的版本中被弃用,并且不会增加主要的新功能。

于 2018-09-10T07:52:47.313 回答
2

WebClient 是非阻塞客户端,RestTemplate 是阻塞客户端。

长期以来,spring 都是作为 web 客户的。在底层,RestTemplate使用基于主题模型的 Java API API。这意味着在客户端收到响应之前,事务将被阻塞。阻塞代码的问题是由于内存和cpu周期的任何字符串的存在。让我们考虑许多正在等待产生结果所需的低服务的应用程序。迟早会收集对结果的请求。结果,该程序产生了许多问题,导致线程池耗尽或占用所有可用内存。由于 cpu 切换,我们还可以体验性能表现。

Spring WebClient 与 RestTemplate

于 2019-10-16T12:37:19.330 回答
2

WebClient 支持异步和同步调用。RestTemplate 仅支持同步调用。即使 RestTemplate 已弃用,旧代码也不需要更改(只要您不需要异步行为)

于 2019-12-24T14:38:18.623 回答
2

RestTemplate并没有真正被弃用。但未来不会进化。RestTemplate因此,如果它满足您的需求,那么坚持是完全有效的。

另一种说法是,如果您需要特定的使用模式,如流式传输、分散/gatter 或自定义超时,这将不会被覆盖RestTemplate,您需要使用它WebClient

现在WebClient在阻塞应用程序中使用也很好。使用block()不应该在那里受到伤害,并且 Spring MVC 控制器确实部分支持反应返回类型。

于 2021-04-12T10:22:01.323 回答