-
测试代码(默认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
-
Client第一次请求,源端口是55564
image.png -
Client第二次请求,源端口是55564
image.png -
Client第三次请求,源端口是55556
image.png -
Client第四次请求,源端口是55568
image.png
Client前两个请求对同一个host发起,复用了55564接口的链接,第三次请求对另外一个HOST发起,由于MaxIdleConns=1,会关闭前一个链接然后发起一个新的链接,第四次同样也会关闭第三次的链接,重新发起。说明MaxIdleConns限制了最大keep-alive的连接数,超出的连接会被关闭掉。
-
设置MaxIdleConns=2 MaxIdleConnsPerHost=1
-
Client第一次请求,源端口是55680
image.png -
Client第二次请求,源端口是55680
image.png -
Client第三次请求,源端口是55681
image.png -
Client 第四次请求,源端口是55680
image.png
Client对不同的两个Host发起的请求,都复用了连接
网友评论