>백엔드 개발 >Golang >Go 언어의 시간 초과 관리 모범 사례 http.Transport

Go 언어의 시간 초과 관리 모범 사례 http.Transport

WBOY
WBOY원래의
2023-07-23 12:18:201249검색

Go 언어 http.Transport의 시간 초과 관리 모범 사례 http.Transport

소개:
Go 언어를 사용하여 네트워크 요청을 할 때 요청 차단 및 리소스 낭비를 피하기 위해 시간 초과를 합리적으로 설정하는 것이 매우 중요합니다. 이 기사에서는 Go 언어에서 시간 초과 관리를 위해 http.Transport를 사용하는 모범 사례를 소개하고 참조용 샘플 코드를 제공합니다.

  1. 시간 초과 설정:
    http.Transport를 사용하여 요청을 보내기 전에 몇 가지 방법을 사용하여 요청 시간 초과를 설정할 수 있습니다. 예를 들어, http.Client 구조의 Timeout 필드를 사용하여 전체 요청에 대한 시간 초과를 설정할 수 있습니다. 예: http.Client结构体的Timeout字段来设置整个请求的超时时间,例如:

    client := &http.Client{
     Timeout: time.Second * 10, // 设置超时时间为10秒
    }

    上述代码中,Timeout字段表示整个请求的超时时间为10秒,当请求的处理时间超过10秒时,该请求将会返回一个net.DialTimeout错误。

此外,我们还可以在使用http.Transport发送请求之前,使用http.RequestTimeout字段来设置单个请求的超时时间。例如:

req, err := http.NewRequest("GET", "http://example.com", nil)
if err != nil {
    log.Fatal(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("User-Agent", "MyClient/1.0")
req.Timeout = time.Second * 5 // 设置单个请求的超时时间为5秒

resp, err := client.Do(req)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    log.Fatal(err)
}

fmt.Println(string(body))

上述代码中,我们通过req.Timeout将单个请求的超时时间设置为5秒,当请求的处理时间超过5秒时,该请求将会返回一个net.DialTimeout错误。

  1. 超时处理:
    当请求发生超时时,我们应该合理地处理这个错误。一种常见的方式是使用context包来控制请求的超时。我们可以创建一个带有超时时间的context.Context,并将其传递给请求的http.Request。例如:

    ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
    defer cancel()
    
    req, err := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil)
    if err != nil {
     log.Fatal(err)
    }

    上述代码中,我们通过context.WithTimeout创建了一个带有10秒超时时间的context.Context,并使用http.NewRequestWithContext将该Context传递给了请求。

在发送请求时,我们可以使用context.Context来监控超时事件。例如:

resp, err := client.Do(req.WithContext(ctx))
if err != nil {
   if err == context.DeadlineExceeded {
       log.Println("请求超时")
       return
   }
   log.Fatal(err)
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    log.Fatal(err)
}

fmt.Println(string(body))

上述代码中,当请求超时发生时,我们会通过判断错误类型是否为context.DeadlineExceededrrreee

위 코드에서 Timeout 필드는 전체 요청의 시간 초과가 10초임을 나타냅니다. 요청 처리 시간이 10초를 초과하면 해당 요청은 net.DialTimeout 오류를 반환합니다.


또한 http.Transport를 사용하여 요청을 보내기 전에 http.RequestTimeout 필드를 사용할 수도 있습니다. 단일 요청에 대한 시간 초과를 설정합니다. 예:

rrreee

위 코드에서는 req.Timeout을 통해 단일 요청의 시간 초과를 5초로 설정했습니다. 요청 처리 시간이 5초를 초과하면 요청은 다음을 반환합니다. net.DialTimeout오류.
    1. 시간 초과 처리:
    2. 요청 시간이 초과되면 이 오류를 합리적으로 처리해야 합니다. 일반적인 방법은 context 패키지를 사용하여 요청 시간 초과를 제어하는 ​​것입니다. 시간 제한이 있는 context.Context를 생성하고 이를 요청의 http.Request에 전달할 수 있습니다. 예:
    3. rrreee
    4. 위 코드에서는 context.WithTimeout을 통해 10초 제한 시간을 갖는 context.Context를 생성하고 http.NewRequestWithContext <code>컨텍스트가 요청에 전달됩니다.
    요청을 보낼 때 context.Context를 사용하여 시간 초과 이벤트를 모니터링할 수 있습니다. 예: rrreee🎜위 코드에서 요청 시간 초과가 발생하면 오류 유형이 context.DeadlineExceeded인지 확인하여 시간 초과 이벤트를 처리합니다. 시간 초과 이벤트인 경우 오류 정보 반환 또는 요청 재시도와 같은 일부 해당 처리 작업을 수행할 수 있습니다. 🎜🎜요약: 🎜Go 언어를 사용하여 네트워크 요청을 할 때 합리적인 시간 초과를 설정하는 것이 매우 중요합니다. 이 문서에서는 Go 언어의 http.Transport를 사용하여 시간 초과 관리에 대한 모범 사례를 소개하고 몇 가지 샘플 코드를 제공합니다. 시간 초과를 적절하게 설정하고 context.Context를 사용하여 시간 초과 이벤트를 모니터링함으로써 요청 시간 초과를 더 잘 관리하고 프로그램의 안정성과 신뢰성을 향상시킬 수 있습니다. 🎜🎜참고자료: 🎜🎜🎜https://golang.org/pkg/net/http/🎜🎜https://golang.org/pkg/net/http/#Client🎜🎜https://golang.org/ pkg /context/🎜🎜https://github.com/dgrijalva/jwt-go🎜🎜

    위 내용은 Go 언어의 시간 초과 관리 모범 사례 http.Transport의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.