spring cloud默认是用feign进行远程调用的,性能会成为瓶颈吗?

feign是http短连接的调用,性能是不如长连接的,难道spring cloud没有发现这个问题吗?在网上也有相关的论述,用http的方式在涉及好几个模块的业务时,性能会明显变慢,我自己的测试也发现了这个问题。那么spring cloud为什么不默认长连接的远程调用方式呢?在这一点上,dubbo似乎做得好一些。

1 个回答

  • java蚂蚁
    慢慢理解世界,慢慢更新自己。
    网上很多文章都说,Feign 默认采用短连接进行远程调用,其实,这种结论是不对的。为什么呢? 下面细致的为大家来解读。 ### Feign中默认情况下的长连接 Feign中,默认情况下,使用的是JDK1.8中的 HttpURLConnection 基础连接类。该类的内部,使用了JDK1.8自带的 HttpClient 请求客户端类去负责完成底层的socket流操作。另外,JDK1.8还提供了一个简单的长连接缓冲类 KeepAliveCache,实现HttpClient 请求客户端类的缓存和复用。 三个类的所处位置为:HttpURLConnection 类处于 java.net 包中,而 HttpClient 类和KeepAliveCache类,则处于sun.net.www.http 包中。 HttpURLConnection、HttpClient、KeepAliveCache三个类的简单关系为: 每个HTTP请求都是一个HttpURLConnection实例,每个请求都会有一个 HttpClient 客户端实例,一个HttpClient 实例都持有一个TCP socket 长连接。如果 HttpClient 实例可以复用,则暂存在KeepAliveCache 缓存实例中。HttpURLConnection 会优先从缓存中取得合适的HttpClient 客户端,如果缓存中没有,HttpURLConnection 才会选择去创建新的HttpClient 实例。 通过三者之间的关系,可以看出: HttpClient 实例的复用,就是底层 TCP socket 长连接的复用。 ### JDK默认的HttpClient 实例对象的复用的问题 和ApacheHttpClient 连接复用相比,JDK默认的HttpClient 实例对象的复用,有以下问题: (1)JDK默认的 HttpClient 实例对象复用的粒度太小,只有URL相同的情况下,才能进行连接复用。而 ApacheHttpClient 连接复用的粒度则大很多,同路由的连接,就可以复用。 (2)在URL字符串变化比较大的场景下,JDK默认的 HttpClient 实例对象的内部连接,会保持一段时间才被释放,会占用系统的连接资源,更加不利于高并发。 所以,从以上两点出发,由于不能相同保证URL的请求数据巨大,所以不建议使用JDK默认的HttpClient 实例对象。建议在Feign中,使用ApacheHttpClient 连接池进行连接的复用。
    发布于 2022-03-23 04:18 •IP属地 江苏
    举报
    评论
    收藏