Maison > développement back-end > Golang > le corps du texte

Comment mettre en œuvre une stratégie de nouvelle tentative pour les requêtes réseau utilisant Go et http.Transport ?

王林
Libérer: 2023-07-21 21:54:20
original
762 Les gens l'ont consulté

Comment mettre en œuvre une stratégie de nouvelle tentative pour les requêtes réseau utilisant Go et http.Transport ?

Lorsque nous effectuons des requêtes réseau, nous rencontrons souvent des requêtes qui échouent en raison de l'instabilité du réseau, d'anomalies du serveur et d'autres raisons. Afin d'améliorer le taux de réussite de la demande, nous pouvons utiliser la stratégie de nouvelle tentative pour renvoyer la demande jusqu'à ce que la demande réussisse ou que le nombre maximum de tentatives soit atteint. Cet article explique comment utiliser http.Transport dans le langage Go pour implémenter une stratégie de nouvelle tentative pour les requêtes réseau.

Tout d'abord, nous devons importer le package suivant :

import (
    "fmt"
    "net/http"
    "time"
)
Copier après la connexion

Ensuite, nous devons créer un http.RoundTripper personnalisé pour implémenter la logique de nouvelle tentative. Nous pouvons créer un RoundTripper personnalisé basé sur http.Transport. Par exemple :

type RetryTransport struct {
    Transport http.RoundTripper
    Retries   int
}
Copier après la connexion

Dans la structure RetryTransport, nous définissons deux champs : Transport et Retries. Le transport est un type http.RoundTripper utilisé pour envoyer des requêtes et recevoir des réponses. Les tentatives représentent le nombre maximum de tentatives.

Ensuite, nous devons implémenter la méthode RoundTrip dans l'interface RoundTripper, qui est utilisée pour envoyer des requêtes et recevoir des réponses. Dans cette méthode, nous pouvons implémenter une logique de nouvelle tentative. Par exemple :

func (r *RetryTransport) RoundTrip(req *http.Request) (*http.Response, error) {
    var resp *http.Response
    var err error

    for i := 0; i <= r.Retries; i++ {
        resp, err = r.Transport.RoundTrip(req)
        
        if err == nil && resp.StatusCode < 500 {
            break
        }
        
        time.Sleep(1 * time.Second)
    }

    return resp, err
}
Copier après la connexion

Dans la méthode RoundTrip, nous utilisons une boucle pour effectuer l'envoi et la réception des requêtes. Le nombre de boucles est déterminé par le nombre maximum de tentatives. Après l'envoi de chaque requête, nous vérifions si une erreur s'est produite et si le code d'état de la réponse est inférieur à 500 (indiquant une exception côté serveur). Si les conditions sont remplies, la requête réussit et la boucle est sautée ; sinon, la requête est renvoyée après 1 seconde d'attente.

Enfin, nous devons utiliser un RetryTransport personnalisé pour créer un http.Client pour l'envoi de requêtes. Par exemple :

func main() {
    retryTransport := &RetryTransport{
        Transport: http.DefaultTransport,
        Retries:   3,
    }

    client := &http.Client{
        Transport: retryTransport,
    }

    resp, err := client.Get("https://example.com")
    if err != nil {
        fmt.Println("请求出错:", err)
        return 
    }

    defer resp.Body.Close()

    // 处理响应
    // ...
}
Copier après la connexion

Dans l'exemple ci-dessus, nous avons créé un RetryTransport et l'avons désigné comme Transport de http.Client. Nous fixons le nombre maximum de tentatives à 3 fois. Nous utilisons ensuite la méthode client.Get pour envoyer la requête et traiter la réponse renvoyée.

En utilisant un RetryTransport personnalisé, nous pouvons mettre en œuvre une stratégie de nouvelle tentative pour les requêtes réseau. Lorsqu'une requête échoue, elle réessaiera automatiquement le nombre de fois spécifié pour améliorer le taux de réussite des requêtes réseau.

Pour résumer, cet article explique comment utiliser http.Transport et RoundTripper personnalisé en langage Go pour implémenter une stratégie de nouvelle tentative pour les requêtes réseau. En définissant le nombre de tentatives et le temps d'attente, nous pouvons mieux faire face à l'instabilité du réseau et aux exceptions du serveur, et améliorer le taux de réussite des requêtes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!