Heim  >  Artikel  >  Backend-Entwicklung  >  http.Fähigkeiten zur Transportoptimierung und Übungsaustausch in der Go-Sprache

http.Fähigkeiten zur Transportoptimierung und Übungsaustausch in der Go-Sprache

WBOY
WBOYOriginal
2023-07-21 09:21:26778Durchsuche

Teilen von Tipps und Praktiken zur http.Transport-Optimierung in der Go-Sprache

Einführung:
In der Go-Sprache ist die Verwendung von http.Transport zum Stellen von Netzwerkanfragen ein sehr häufiger Vorgang. Bei großen gleichzeitigen Anforderungen kann die unangemessene Verwendung von http.Transport jedoch leicht zu Leistungsengpässen bei Netzwerkanforderungen führen. In diesem Artikel werden einige Optimierungstechniken und -praktiken untersucht, die Entwicklern dabei helfen sollen, die Leistung von Netzwerkanforderungen besser zu verbessern.

1. Verbindungspool verwenden
Standardmäßig erstellt http.Transport eine gleichzeitige Verbindung für jede HTTP-Anfrage. Dies hat den Vorteil, dass die gleichzeitigen Verarbeitungsfunktionen des Servers voll ausgenutzt werden können, es verursacht jedoch auch einige Probleme. Erstens kann das häufige Erstellen und Schließen von Verbindungen zu unnötigem Leistungsaufwand führen. Zweitens ist die Anzahl der Verbindungen auf dem Server möglicherweise begrenzt, und zu viele gleichzeitige Anforderungen können zu einem Denial-of-Service auf dem Server führen. Daher können diese Probleme durch die Verwendung von Verbindungspooling wirksam vermieden werden.

Codebeispiel:

package main

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

var client *http.Client

func init() {
    transport := &http.Transport{
        MaxIdleConns:        100,               // 最大空闲连接数
        IdleConnTimeout:     90 * time.Second,  // 空闲连接的超时时间
        TLSHandshakeTimeout: 10 * time.Second,  // TLS握手的超时时间
        ExpectContinueTimeout: 1 * time.Second, // 100-continue状态响应的超时时间
    }
    client = &http.Client{
        Transport: transport,
        Timeout:   10 * time.Second, // 完整请求的超时时间
    }
}

func main() {
    resp, err := client.Get("https://www.example.com")
    if err != nil {
        fmt.Println("请求错误:", err)
        return
    }
    defer resp.Body.Close()

    // 处理响应
    // ...
}

2. Keep-Alive aktivieren

Keep-Alive ist ein Mechanismus für HTTP-Persistent-Verbindungen, der es dem Client und Server ermöglicht, mehrere HTTP-Anfragen und -Antworten über dieselbe TCP-Verbindung zu senden. Durch die Aktivierung von Keep-Alive können die Kosten für den Verbindungsaufbau gesenkt und die Leistung von Netzwerkanfragen verbessert werden.

In http.Transport ist Keep-Alive standardmäßig aktiviert. Wenn der Server jedoch Keep-Alive nicht unterstützt, werden weiterhin häufig Verbindungen erstellt und geschlossen. Daher können wir die maximale Anzahl inaktiver Verbindungen pro Host steuern, indem wir die MaxIdleConnsPerHost-Eigenschaft von http.Transport festlegen und so die Häufigkeit des Erstellens und Schließens von Verbindungen verringern.

Codebeispiel:

package main

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

var client *http.Client

func init() {
    transport := &http.Transport{
        MaxIdleConns:        100,               // 最大空闲连接数
        MaxIdleConnsPerHost: 10,                // 每个host的最大空闲连接数
        IdleConnTimeout:     90 * time.Second,  // 空闲连接的超时时间
        TLSHandshakeTimeout: 10 * time.Second,  // TLS握手的超时时间
        ExpectContinueTimeout: 1 * time.Second, // 100-continue状态响应的超时时间
    }
    client = &http.Client{
        Transport: transport,
        Timeout:   10 * time.Second, // 完整请求的超时时间
    }
}

func main() {
    resp, err := client.Get("https://www.example.com")
    if err != nil {
        fmt.Println("请求错误:", err)
        return
    }
    defer resp.Body.Close()

    // 处理响应
    // ...
}

3. Verbindungswiederverwendung aktivieren

In einigen Szenarien, in denen Anfragen häufig gesendet werden müssen, kann die Aktivierung der Verbindungswiederverwendung die Leistung weiter optimieren. Unter Wiederverwendung von Verbindungen versteht man das Offenhalten der TCP-Verbindung nach dem Senden einer Anfrage, sodass die Verbindung bei der nächsten Anfrage weiterhin verwendet werden kann.

Codebeispiel:

package main

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

var client *http.Client

func init() {
    transport := &http.Transport{
        MaxIdleConns:        100,                // 最大空闲连接数
        MaxIdleConnsPerHost: 10,                 // 每个host的最大空闲连接数
        IdleConnTimeout:     90 * time.Second,   // 空闲连接的超时时间
        TLSHandshakeTimeout: 10 * time.Second,   // TLS握手的超时时间
        ExpectContinueTimeout: 1 * time.Second,  // 100-continue状态响应的超时时间
        DisableKeepAlives:   false,              // 启用连接复用
    }
    client = &http.Client{
        Transport: transport,
        Timeout:   10 * time.Second,  // 完整请求的超时时间
    }
}

func main() {
    resp, err := client.Get("https://www.example.com")
    if err != nil {
        fmt.Println("请求错误:", err)
        return
    }
    defer resp.Body.Close()

    // 处理响应
    // ...
}

Fazit:
Durch die Verwendung von Verbindungspooling, die Aktivierung von Keep-Alive und die Wiederverwendung von Verbindungen können wir die Leistung von Netzwerkanforderungen mithilfe der Sprache http.Transport in Go effektiv verbessern. Natürlich können für unterschiedliche Geschäftsszenarien und -anforderungen weitere Optimierungen und Anpassungen erforderlich sein. Ich hoffe, dass dieser Artikel für Entwickler hilfreich sein kann.

Das obige ist der detaillierte Inhalt vonhttp.Fähigkeiten zur Transportoptimierung und Übungsaustausch in der Go-Sprache. 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