Heim  >  Artikel  >  Backend-Entwicklung  >  Golang-HTTP-Anfragezeitüberschreitung

Golang-HTTP-Anfragezeitüberschreitung

PHPz
PHPzOriginal
2023-05-10 18:03:371363Durchsuche

Beim Schreiben von HTTP-Anwendungen in Golang kann es aufgrund der Instabilität der Netzwerkumgebung zu Zeitüberschreitungsproblemen bei HTTP-Anfragen kommen.

In diesem Artikel erfahren Sie, wie Sie in Golang ein Zeitlimit für HTTP-Anfragen festlegen, um Blockierungen und unendliches Warten zu verhindern.

Was ist ein HTTP-Anfrage-Timeout? Diese Situation tritt im Allgemeinen bei Netzwerkverzögerungen, hoher Auslastung, unzureichenden Serverressourcen usw. auf.

Wenn bei HTTP-Anwendungen in Golang keine Antwort oder eine Anfrage mit langer Antwortzeit erfolgt, müssen wir das Zeitlimit für HTTP-Anfragen festlegen, um zu verhindern, dass die Anwendung blockiert und auf unbestimmte Zeit wartet.

Warum Sie das Timeout festlegen müssen

In einer Golang-Anwendung ist jede HTTP-Anfrage eine Goroutine, die die Anfrage im Netzwerk sendet und auf die Antwort wartet. Wenn das Anforderungszeitlimit nicht festgelegt ist, kann es dazu führen, dass das Programm blockiert und in eine Endlosschleife gerät, während es auf eine Antwort wartet, was die Belastung des Servers erhöht und die Leistung verringert.

Darüber hinaus können böswillige Benutzer oder Angreifer in der Anwendung gefälschte Anfragen senden, um die Anwendung lange auf eine Antwort warten zu lassen und so die Serverressourcen zu erschöpfen.

Daher kann das Festlegen des Zeitlimits für HTTP-Anfragen sicherstellen, dass nicht zu viel Zeit und Ressourcen verschwendet werden, bevor die Antwort empfangen wird, und verhindern, dass die Anwendung angegriffen wird und keine Ressourcen mehr zur Verfügung stehen.

HTTP-Anfrage-Timeout in Golang festlegen

In Golang können wir die Net/http-Bibliothek verwenden, um HTTP-Anfragen zu senden und das Timeout festzulegen. Der in der Bibliothek definierte Client-Typ verfügt über eine Timeout-Eigenschaft, mit der Sie ein Timeout festlegen können.

Das Folgende ist der Beispielcode:

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    client := http.Client{
        Timeout: time.Second * 5, // 设置超时时间为5秒
    }

    req, err := http.NewRequest(http.MethodGet, "https://www.example.com", nil)
    if err != nil {
        panic(err)
    }

    res, err := client.Do(req)
    if err != nil {
        panic(err)
    }

    fmt.Println(res)
}

In diesem Beispielcode erstellen wir einen HTTP-Client und legen das Timeout auf 5 Sekunden fest. Anschließend senden wir eine GET-Anfrage an https://www.example.com und warten auf die Antwort. Wenn die Anfrage abläuft oder die Antwort zu lange dauert, wird sie innerhalb von 5 Sekunden beendet.

So behandeln Sie Timeout-Fehler

Im obigen Beispielcode verwenden wir die Panic-Funktion, um Timeout-Fehler bei HTTP-Anfragen zu behandeln. In realen Anwendungen sollten jedoch zuverlässigere Methoden zur Behandlung von Timeout-Fehlern verwendet werden.

Das Folgende ist eine zuverlässigere Methode: Fügen Sie der Anfrage einen Kontext hinzu und verwenden Sie eine Select-Anweisung, um Zeitüberschreitungen und normale Antworten zu verarbeiten:

package main

import (
    "context"
    "fmt"
    "net/http"
    "time"
)

func main() {
    client := http.Client{
        Timeout: time.Second * 5, // 设置超时时间为5秒
    }

    req, err := http.NewRequest(http.MethodGet, "https://www.example.com", nil)
    if err != nil {
        panic(err)
    }

    ctx, cancel := context.WithTimeout(req.Context(), time.Second*5)
    defer cancel() // 在函数退出时取消Context

    req = req.WithContext(ctx) // 使用带有超时的Context创建新请求

    resp, err := client.Do(req)
    if err != nil {
        select {
        case <-ctx.Done(): // 超时错误
            fmt.Println("Request timed out")
        default: // 其他错误
            panic(err)
        }
    }

    defer resp.Body.Close()
    fmt.Println(resp.StatusCode)
}

In diesem Beispielcode erstellen wir Erstellen Sie einen Kontext und verwenden Sie die WithTimeout-Funktion, um das Timeout festzulegen. Dann erstellen wir eine neue Anfrage mithilfe eines Kontexts mit Zeitüberschreitung und senden diese Anfrage.

Wenn bei der Anfrage eine Zeitüberschreitung auftritt oder andere Fehler auftreten, werden je nach Fehlertyp unterschiedliche Behandlungsmethoden angewendet. Dies ermöglicht uns eine bessere Kontrolle über die Anwendung und einen reibungslosen Umgang mit Fehlersituationen.

Zusammenfassung

Um Blockierungen und endloses Warten zu vermeiden, ist es beim Schreiben von HTTP-Anwendungen in Golang sehr wichtig, das Zeitlimit für HTTP-Anfragen festzulegen. Wir können das Timeout mithilfe des Client-Typs aus der net/http-Bibliothek festlegen. Und verwenden Sie Context- und Select-Anweisungen, um Timeout-Fehler und andere Fehler zu behandeln.

Wenn Sie leistungsstarke und stabile Anwendungen schreiben, sollten Sie basierend auf der tatsächlichen Situation ein angemessenes Timeout festlegen. Dadurch wird sichergestellt, dass die Anwendung auch in unkontrollierten Umgebungen weiterhin ordnungsgemäß funktionieren kann.

Das obige ist der detaillierte Inhalt vonGolang-HTTP-Anfragezeitüberschreitung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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