WebClient 与 RestTemplate

Posted

技术标签:

【中文标题】WebClient 与 RestTemplate【英文标题】:WebClient vs RestTemplate 【发布时间】:2018-06-07 01:41:09 【问题描述】:

根据春季 5:

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

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

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

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

【问题讨论】:

没有。 RestTemplate 保持存在。 在这些场景中最好使用 WebClient,即当您想要一个响应式 Web 客户端(异步、非阻塞、使用 Flux/Mono)时。 【参考方案1】:

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

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

如果您需要这样的功能,那么是的,您需要用 WebClient 替换您的 Resttemplate。 实际上,您可以使用.block() 在 webclient 中实现类似同步处理的 Rest 模板。但其他方式是不可能的。

编辑:

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

【讨论】:

你能检查一下最新的吗?它说,它已弃用 @pramod 什么被弃用了? docs.spring.io/spring/docs/current/javadoc-api/org/… 这里说rest模板将在未来的版本中贬值 Spring 5.0 文档说 RestTemplate 将被弃用,但 Spring 5.2 软化了这一点,它说是维护模式。【参考方案2】:

RestTemplate 并没有真正被弃用。但未来不会进化。所以坚持RestTemplate 是完全有效的,如果它可以满足您的需要。

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

那么现在哪个是正确答案?我们真的不想迁移已弃用的迁移 docs.spring.io/spring/docs/current/javadoc-api/org/… 这里说它将在未来的版本中被弃用 上面已经说过了,但他们不再称其为“已弃用”:“注意:从 5.0 开始,该类处于维护模式,仅接受较小的更改请求和错误。请考虑使用org.springframework.web.reactive.client.WebClient,它具有更现代的 API 并支持同步、异步和流式处理方案。”【参考方案4】:

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

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

Spring WebClient vs. RestTemplate

【讨论】:

“Java API API,基于主题模型”——这对我来说毫无意义。需要一些修正吗?另外:“这件事将被阻止”-您的意思是线程吗?这有很多错误 - 我建议缩短或删除这个答案。【参考方案5】:

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

【讨论】:

以上是关于WebClient 与 RestTemplate的主要内容,如果未能解决你的问题,请参考以下文章

WebClient 与 RestTemplate

WebClient 5.3+ 交换与 exchangeToMono。一起提取 cookie 和 body

WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择

Webclient 与简单 Flux.just 的 Flux 行为不同

C#使用WebClient与WebRequest有啥不同

如何将 Spring WebClient 与 Jetty 一起使用,而不是 Netty?