Spring Cloud Feign:Feign与RestTemplate相比是不是足够高效?

Posted

技术标签:

【中文标题】Spring Cloud Feign:Feign与RestTemplate相比是不是足够高效?【英文标题】:Spring Cloud Feign: Is Feign efficient enough compared with RestTemplate?Spring Cloud Feign:Feign与RestTemplate相比是否足够高效? 【发布时间】:2016-12-08 19:59:07 【问题描述】:

我快速浏览了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好?

【问题讨论】:

你也可以插入okhttp来feign。 如果我没记错的话,feignclient 有一个问题,它不允许缓存。 RestTemplate 允许你使用缓存。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

以上是关于Spring Cloud Feign:Feign与RestTemplate相比是不是足够高效?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud ---- 服务消费与负载均衡(feign)

Spring cloud Feign 深度学习与应用

Spring Cloud Feign 使用方法与性能优化

spring-cloud Feign

Spring Cloud Alibaba 使用 feign 和 rebion 进行服务消费

笔记:Spring Cloud Feign 其他配置