HttpURLConnection长连接详解

JDK自带的HttpURLConnection,默认启用keepAlive,支持HTTP / 1.1和HTTP / 1.0持久连接, 使用后的HttpURLConnection会放入缓存中供以后的同host:port的请求重用,底层的socket在keepAlive超时之前不会关闭。

HttpURLConnection受以下system properties控制:
http.keepAlive=<boolean>(默认值:true),是否启用keepAlive,如果设置为false,则HttpURLConnection不会缓存,使用完后会关闭socket连接。
http.maxConnections=<int>(默认值:5),每个目标host缓存socket连接的最大数。

1、如果在HttpURLConnection的header中加入Connection: close,则此连接不会启用keepAlive

2、想要启用keepAlive,程序请求完毕后,必须调用HttpURLConnection.getInputStream().close()(表示归还长连接给缓存,以供下次同host:port的请求重用底层socket连接),而不能调用HttpURLConnection.disconnect()(表示关闭底层socket连接,不会启用keepAlive)

3、keepAliveTimeout首先从http response header中获取,如果没有取到,则默认为5秒,sun.net.www.http.KeepAliveCache.java中有一个线程,每5秒执行一次,检查缓存的连接的空闲时间是否超过keepAliveTimeout,如果超过则关闭连接。从KeepAliveCache中获取缓存的连接时也会检查获取到的连接的空闲时间是否超过keepAliveTimeout,如果超过则关闭连接,并且获取下一个连接,再执行以上检查,直达获取到空闲时间在keepAliveTimeout以内的缓存连接为此。

标签: HttpURLConnection长连接详解

已有 3 条评论

  1. 小韩飞刀 小韩飞刀

    http长连接是需要客户端和服务端双方支持,默认的tomcat启动 是不会返回Connetion:keep-alive,所以spring cloud默认是http短连接,改成长连接的话需要池化组件okhttp3/apache httpclient, 容器使用undertow,或者在tomcat中配置keepalive时间和请求数量,然后response header中加入keep-alive的支持

    1. SMOKEN SMOKEN

      在HTTP 1.1中,除非在response header中设置Connection: close,否则默认是保持keepalive,现在基本上都是用的HTTP 1.1

      1. 小韩飞刀 小韩飞刀

        服务端的Response header 中不返回 Connection:keep-alive 是没用的,需要和对端发送心跳包,你可以看下http 长连接。仅仅是客户端发送请求保持长连接是不够的,可以看下华为开源的serviceComb(基于vert.x的http长连接),spring cloud 方案中最欠缺就是高性能方案(spring cloud RPC方案),需要做很多处理,如果仅仅是靠机器来顶那当我没说。个人压测的结果是现在的spring cloud版本做足了优化的策略是可以和Dubbo性能持平,但是比不上sofa rpc。而且不仅仅是Http1.1开始默认keep-alive,你还要考虑到io复用和池化等其他的因素。

添加新评论