在项目中使用一个第三方的api,发现每次请求都在创建一个http请求,用完既丢.
于是查阅资料对其修改变为一个静态字段,重复使用
1. 创建一个http请求池
package client import ( "net" "net/http" "time" ) const ( IdleConnTimeout int = 90 ) var ( longTransport *http.Transport = &http.Transport{ Proxy:http.ProxyFromEnvironment, DialContext:(&net.Dialer{ Timeout:60 * time.Second, KeepAlive:60 * time.Second, }).DialContext, MaxIdleConns: 512, MaxIdleConnsPerHost: 512, IdleConnTimeout: time.Duration(IdleConnTimeout)* time.Second, } ) func NewClient() *http.Client{ return &http.Client{ //Transport: http.DefaultTransport, // http 默认长链接设置 Transport:longTransport, Timeout:time.Second * 60, } }
2. mian包中对其请求测试
func main() { request, err := http.NewRequest("GET", "https://wiki.biligame.com/blhx/%E9%A6%96%E9%A1%B5", nil) if err != nil { log.Println(err) } /* 循环三次长链接所需时间 one teo three four 1.184.0079ms 181.3672ms 124.6007ms 141.4977ms 2.138.5282ms 100.0047ms 171.2998ms 100.2751ms 3.140.0335ms 109.0296ms 111.2939ms 111.7786ms 结果为除了第一次连接,之后的连接比第一次连接时间少 */ for i:=0;i<3 ; i++ { startTime := time.Now() response, err := LongClient.Do(request) if response.StatusCode != 200 { log.Println("http resp code=", response.StatusCode, err) } log.Printf("response success is code = %d",response.StatusCode) endTime := time.Now() log.Println("request start wiat for time :",startTime.String()) log.Println("request end wiat for time :",endTime.String()) log.Printf("response wiat for time : %s",endTime.Sub(startTime).String()) // 单次测试164.0372ms response.Body.Close() } }
而不使用链接池,循环三次,每次创建HTTP请求
func main() { request,_ := http.NewRequest("GET","https://wiki.biligame.com/blhx/%E9%A6%96%E9%A1%B5",nil) /* 循环三次长链接所需时间 one teo three four 1.230.7228ms 202.0134ms 225.9359ms 171.0883ms 2.159.8703ms 152.1385ms 148.9046ms 102.9468ms 3.133.9989ms 142.9298ms 135.4251ms 122.8589ms */ for i:=0;i<3 ;i++ { client := &http.Client{} startTime := time.Now() response, err := client.Do(request) if response.StatusCode != 200 { log.Println("http resp code=", response.StatusCode, err) reqResult, err := ioutil.ReadAll(response.Body) if err != nil { log.Println(err) } log.Println(string(reqResult)) } log.Printf("response success is code = %d",response.StatusCode) endTime := time.Now() log.Println("request start wiat for time :",startTime.String()) log.Println("request end wiat for time :",endTime.String()) log.Printf("response wiat for time : %s",endTime.Sub(startTime).String()) //152.988ms response.Body.Close() } }
第一次链接时间通常都比链接池第一次链接时间长,第二次,第三次对比起来减少 10%-20% 等待时间
ohter http包默认链接池设置
// DefaultTransport is the default implementation of Transport and is // used by DefaultClient. It establishes network connections as needed // and caches them for reuse by subsequent calls. It uses HTTP proxies // as directed by the $HTTP_PROXY and $NO_PROXY (or $http_proxy and // $no_proxy) environment variables. var DefaultTransport RoundTripper = &Transport{ Proxy: ProxyFromEnvironment, DialContext: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, DualStack: true, }).DialContext, ForceAttemptHTTP2: true, MaxIdleConns: 100, IdleConnTimeout: 90 * time.Second, TLSHandshakeTimeout: 10 * time.Second, ExpectContinueTimeout: 1 * time.Second, }