golang http请求变为长链接


在项目中使用一个第三方的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,
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM