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 5.3+ 交换与 exchangeToMono。一起提取 cookie 和 body
WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择