Spring Cloud Feign:与RestTemplate相比,Feign足够高效吗?

19
我快速浏览了 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
你也可以将OkHttp插入到Feign中。 - spencergibb
如果我没记错的话,FeignClient存在一个问题,就是它不允许缓存。而RestTemplate则可以使用缓存。 - duardito
2个回答

7

这是一个旧问题,但是值得在此提到的是,自Spring 5版本起,RestTemplate已被弃用,建议使用WebClient。


1
与Feign相比,RestTemplate利用默认客户端性能的优势(尽管已经被映射出该客户端在Java 11中存在连接重置的问题),但在集成日志库方面较为困难且编程方法更加冗长和难以测试。
另一个支持Feign的好处是易于实现与Hystrix组合的回退策略,实现自定义ErrorDecoder。
如果您想更深入地了解Feign的实现,请查看此文章链接。
谈到性能,RestTemplate的另一个注意点是它使用基于线程的请求模型的Java Servlet API。这意味着线程将阻塞,直到Web客户端接收到响应,这可能会导致性能下降并浪费资源,如内存和CPU周期,特别是在与慢服务通信时。另一方面,对于Feign来说,这不是问题,因为它可以与异步客户端一起使用,这些客户端不会阻塞线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接