17

我快速浏览了 Feign 的源代码,发现 Feign 使用 JDKHttpUrlConnection发出 HTTP 请求并在请求完成时关闭它,而不使用连接池。我怀疑这种方式的效率。然后我阅读了 Spring 的文档,上面RestTemplate写着RestTemplate可以切换到 Apache Http Client 或 OKHttp 来发送 HTTP 请求:

注意:默认情况下,RestTemplate 依赖于标准 JDK 工具来建立 HTTP 连接。您可以通过 HttpAccessor.setRequestFactory(org.springframework.http.client.ClientHttpRequestFactory) 属性切换到使用不同的 HTTP 库,例如 Apache HttpComponents、Netty 和 OkHttp。

是不是说从性能上看 RestTemplate 比 Feign 好?

4

2 回答 2

5

老问题,但在这里可能值得一提的是,从 Spring 5 开始,RestTemplate 已被弃用,取而代之的是 WebClient。

于 2019-12-12T21:41:03.283 回答
1

与 Feign 相比,RestTemplate 充分利用了默认客户端性能(尽管映射到该客户端在连接重置方面存在 Java 11 问题),但它在集成日志库的易用性以及更冗长和更难测试方面失去了优势程序化方法。

另一个支持 Feign 的优点是易于实现与 Hystrix 结合的后备策略,实现 custom ErrorDecoder

如果您想更深入地了解 Feign 的实现方式,请查看这篇文章

说到性能,RestTemplate 的另一个注意点是它使用了 Java Servlet API,它基于 thread-per-request 模型。这意味着线程将阻塞,直到 Web 客户端收到响应,这可能导致性能下降并浪费内存和 CPU 周期等资源,特别是在与慢速服务通信时。另一方面,这对 Feign 来说不是问题,因为它可以用于异步客户端,而不是线程阻塞。

于 2021-02-16T20:31:39.670 回答