golang http client keep-alive最大连接数

  • 测试代码(默认MaxIdleConns=100, MaxIdleConnsPerHost=2)

 package main

import (

    "io"

    "io/ioutil"

    "net/http"

    "time"

)

func worker(client *http.Client) {

    resp, _ := client.Get("[http://www.qq.com/"](http://192.168.31.1/%22);)

    io.Copy(ioutil.Discard, resp.Body)

    defer resp.Body.Close()

}

func worker2(client *http.Client) {

    resp, _ := client.Get("[http://httpbin.org/get"](http://httpbin.org/get%22);)

    io.Copy(ioutil.Discard, resp.Body)  //必须读取Body并且关闭,否者不会被复用

    defer resp.Body.Close() 

}

func main() {

    tr := &http.Transport{

        MaxIdleConns: 100,

        MaxIdleConnsPerHost: 2,

    }

    client := &http.Client{

        Transport: tr,

    }

    worker(client)

    time.Sleep(time.Second * 1)

    worker(client)

    time.Sleep(time.Second * 1)

    worker2(client)

    time.Sleep(time.Second * 1)

    worker(client)

    time.Sleep(time.Second * 1)

}
  • 设置MaxIdleConns=MaxIdleConnsPerHost=1

  1. Client第一次请求,源端口是55564


    image.png
  2. Client第二次请求,源端口是55564


    image.png
  3. Client第三次请求,源端口是55556


    image.png
  4. Client第四次请求,源端口是55568


    image.png

Client前两个请求对同一个host发起,复用了55564接口的链接,第三次请求对另外一个HOST发起,由于MaxIdleConns=1,会关闭前一个链接然后发起一个新的链接,第四次同样也会关闭第三次的链接,重新发起。说明MaxIdleConns限制了最大keep-alive的连接数,超出的连接会被关闭掉。

  • 设置MaxIdleConns=2 MaxIdleConnsPerHost=1

  1. Client第一次请求,源端口是55680


    image.png
  2. Client第二次请求,源端口是55680


    image.png
  3. Client第三次请求,源端口是55681


    image.png
  4. Client 第四次请求,源端口是55680


    image.png

Client对不同的两个Host发起的请求,都复用了连接

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容