Spring Cloud Feign:与RestTemplate相比,Feign的效率是否足够?

时间:2016-08-03 08:02:35

标签: spring-cloud spring-cloud-feign

我很快浏览了Feign的源代码,我发现Feign使用JDK' HttpUrlConnection来发出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?

2 个答案:

答案 0 :(得分:0)

一个老问题,但在这里可能值得一提的是,从Spring 5开始,不推荐使用RestTemplate,而推荐使用WebClient。

答案 1 :(得分:0)

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

支持 Feign 的另一个好处是易于实现与 Hystrix 相结合的回退策略,实现自定义 ErrorDecoder

如果您想更深入地了解 Feign 的实现方式,请查看 this article

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