GCP云功能-执行-goroutine HTTPS TLS握手超时

时间:2019-06-07 15:49:36

标签: go google-cloud-functions

我正在尝试在golang GCP Cloud函数中使用goroutine,使用或不使用goroutine进行身份验证代码,都会收到不同的结果。

我正在调用一个函数“ Instance()”,该函数发出HTTPS GET请求。如果在没有goroutine的情况下调用该函数,则所有操作均按预期进行。如果使用goroutine'go Instance()'调用该函数,则对于相同的调用,我会收到'TLS握手超时'。

我认为TLS和并发性存在问题,但是找不到任何信息。

func GoRoutineTest(w http.ResponseWriter, r *http.Request) {

    defaultRoundTripper := http.DefaultTransport
    defaultTransportPointer, ok := defaultRoundTripper.(*http.Transport)

    if !ok {
        panic(fmt.Sprintf("defaultRoundTripper not an *http.Transport"))
    }

    defaultTransport := *defaultTransportPointer // dereference it to get a copy of the struct that the pointer points to
    defaultTransport.TLSHandshakeTimeout = 10 * time.Second
    defaultTransport.MaxIdleConns = 100
    defaultTransport.MaxIdleConnsPerHost = 100

    client = &http.Client{Transport: &defaultTransport}

    for i := 0; i < 8; i++ {
            Instance()        /* This works as expected */
            go Instance()     /* This fails with 'TLS handshake timeout' */
    }
}


func Instance( ) {

    resp, err := client.Get("https://google.com")
    if err != nil {
        fmt.Println(err)
    } else {
        defer resp.Body.Close()

        if resp.StatusCode == http.StatusOK {
            bodyBytes, err := ioutil.ReadAll(resp.Body)
            if err != nil {
                fmt.Println(err)
            }

        fmt.Println(resp.StatusCode)

        bodyString := string(bodyBytes)
        fmt.Println(bodyString)
        }
    }
}

0 个答案:

没有答案