golang http连接池实现

连接池

  1. golang http1.1默认开启连接池

  2. 在Transport里面实现

  3. 关闭连接池

    • 将DisableKeepAlives设置为true或者将MaxIdleConnsPerHost设置小于0的值

      func (t *Transport) tryPutIdleConn(pconn *persistConn) error {
      	if t.DisableKeepAlives || t.MaxIdleConnsPerHost < 0 {
      		return errKeepAlivesDisabled
      	}
      	...
      }
      
  4. 默认开启

    • 请求完成后,会把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中不存在,则新建

你可能感兴趣的:(golang,golang源码阅读,golang,http)