Heim > Backend-Entwicklung > Golang > Best Practices für das Timeout-Management in der Go-Sprache http.Transport

Best Practices für das Timeout-Management in der Go-Sprache http.Transport

WBOY
Freigeben: 2023-07-23 12:18:20
Original
1221 Leute haben es durchsucht

Best Practices für die Zeitüberschreitungsverwaltung in der Go-Sprache http.Transport

Einführung:
Bei der Verwendung der Go-Sprache zum Stellen von Netzwerkanfragen ist es sehr wichtig, Zeitüberschreitungen angemessen festzulegen, um Anforderungsblockierungen und Ressourcenverschwendung zu vermeiden. In diesem Artikel werden die Best Practices für die Verwendung von http.Transport für die Timeout-Verwaltung in der Go-Sprache vorgestellt und einige Beispielcodes als Referenz bereitgestellt.

  1. Zeitlimit festlegen:
    Bevor wir eine Anfrage über http.Transport senden, können wir einige Methoden verwenden, um das Zeitlimit für die Anfrage festzulegen. Beispielsweise können wir das Feld Timeout der Struktur http.Client verwenden, um das Timeout für die gesamte Anfrage festzulegen, zum Beispiel: http.Client结构体的Timeout字段来设置整个请求的超时时间,例如:

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

    上述代码中,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))
Nach dem Login kopieren

上述代码中,我们通过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)
    }
    Nach dem Login kopieren

    上述代码中,我们通过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))
Nach dem Login kopieren

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

Im obigen Code Timeout gibt an, dass die Zeitüberschreitung der gesamten Anfrage 10 Sekunden beträgt. Wenn die Verarbeitungszeit der Anfrage 10 Sekunden überschreitet, gibt die Anfrage einen net.DialTimeout-Fehler zurück.


Darüber hinaus können wir auch das Feld Timeout von http.Request verwenden, bevor wir die Anfrage mit http.Transport senden Legen Sie das Zeitlimit für eine einzelne Anfrage fest. Beispiel:

rrreee

Im obigen Code legen wir den Timeout einer einzelnen Anfrage über req.Timeout auf 5 Sekunden fest. Wenn die Verarbeitungszeit der Anfrage 5 Sekunden überschreitet, gibt die Anfrage a zurück net.DialTimeoutFehler.
    1. Timeout-Behandlung:
    2. Wenn bei einer Anfrage eine Zeitüberschreitung auftritt, sollten wir diesen Fehler angemessen behandeln. Eine gängige Methode ist die Verwendung des context-Pakets zur Steuerung von Anforderungszeitüberschreitungen. Wir können einen context.Context mit einem Timeout erstellen und ihn an den http.Request der Anfrage übergeben. Zum Beispiel:
    3. rrreee
    4. Im obigen Code erstellen wir einen context.Context mit einem 10-Sekunden-Timeout über context.WithTimeout und verwenden http.NewRequestWithContext Der <code>Kontext wird an die Anfrage übergeben.
    Beim Senden einer Anfrage können wir context.Context verwenden, um Timeout-Ereignisse zu überwachen. Zum Beispiel: rrreee🎜Wenn im obigen Code ein Anforderungs-Timeout auftritt, behandeln wir das Timeout-Ereignis, indem wir bestimmen, ob der Fehlertyp context.DeadlineExceeded ist. Wenn es sich um ein Timeout-Ereignis handelt, können wir einige entsprechende Verarbeitungsvorgänge durchführen, z. B. die Rückgabe von Fehlerinformationen oder den erneuten Versuch der Anforderung. 🎜🎜Zusammenfassung: 🎜Wenn Sie die Go-Sprache verwenden, um Netzwerkanfragen zu stellen, ist es sehr wichtig, ein angemessenes Timeout festzulegen. In diesem Artikel werden Best Practices für die Timeout-Verwaltung mithilfe von http.Transport in der Go-Sprache vorgestellt und einige Beispielcodes bereitgestellt. Indem wir das Timeout entsprechend festlegen und context.Context zur Überwachung von Timeout-Ereignissen verwenden, können wir Anforderungs-Timeouts besser verwalten und die Stabilität und Zuverlässigkeit des Programms verbessern. 🎜🎜Referenzen: 🎜🎜🎜https://golang.org/pkg/net/http/🎜🎜https://golang.org/pkg/net/http/#Client🎜🎜https://golang.org/ pkg /context/🎜🎜https://github.com/dgrijalva/jwt-go🎜🎜

    Das obige ist der detaillierte Inhalt vonBest Practices für das Timeout-Management in der Go-Sprache http.Transport. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:php.cn
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage