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)