连接池
-
golang http1.1默认开启连接池 -
在Transport里面实现 -
关闭连接池
-
将DisableKeepAlives设置为true或者将MaxIdleConnsPerHost设置小于0的值 func (t *Transport) tryPutIdleConn(pconn *persistConn) error {
if t.DisableKeepAlives || t.MaxIdleConnsPerHost < 0 {
return errKeepAlivesDisabled
}
...
}
-
默认开启
-
请求完成后,会把persistConn通过tryPutIdleConnPerHost放入连接池中 -
如果在Transport的idleConn存在
- 先查看Transport的idleConnWait是否存在需要待分配persistConn的wantConn,idleConnWait由map实现(map[connectMethodKey]wantConnQueue),key为connectMethodKey,value为队列,如果队列中存在,则直接将该persistConn分配给对应的wantConn
type connectMethodKey struct {
proxy, scheme, addr string
onlyH1 bool
}
- 如果不存在等待队列,则将persistConn加入idleConn
- 如果对应host里面的conn过多,则返回errTooManyIdleHost错误,关闭该连接
- 通过LRU加入所有的存储了所有连接的idleLRU里面去
- 如果idleLRU的长度超过Transport的MaxIdleConns,则关闭最久未使用的persistConn
- 如果IdleConnTimeout设置了超时时间,并且persistConn的alt为nil(alt在http2中使用),则设置该persistConn的超时时间,超过时间没有再使用过,则关闭这个连接,DefaultTransport里面设置的为90s
-
如果在idleConn中不存在,则新建
|