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中不存在,则新建

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值