Maison >développement back-end >Golang >Comment dupliquer des requêtes HTTP sur plusieurs serveurs dans Go pour des transitions de serveur transparentes ?

Comment dupliquer des requêtes HTTP sur plusieurs serveurs dans Go pour des transitions de serveur transparentes ?

DDD
DDDoriginal
2024-12-01 16:47:12709parcourir

How to Duplicate HTTP Requests to Multiple Servers in Go for Seamless Server Transitions?

Duplication des requêtes HTTP vers plusieurs serveurs dans Go

Lors de la transition d'une version de serveur à une autre, il peut être souhaitable de dupliquer les requêtes HTTP entrantes vers les deux versions pour un transfert transparent. Cependant, l'approche naïve consistant à modifier directement la requête se heurte à une erreur.

Pour résoudre ce problème, la solution consiste à créer une nouvelle requête HTTP et à copier les parties nécessaires de la requête entrante. Cela implique :

  1. Mise en mémoire tampon du corps de la requête : Comme le même corps peut devoir être utilisé sur les deux serveurs, il doit être mis en mémoire tampon pour la lecture.
  2. Reconstruction de la requête : Une nouvelle requête HTTP est créée avec la méthode d'origine et une URL créée à partir du RequestURI. Les en-têtes pertinents sont copiés.

Voici un exemple de code :

func handler(w http.ResponseWriter, req *http.Request) {
    body, err := ioutil.ReadAll(req.Body)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    req.Body = ioutil.NopCloser(bytes.NewReader(body))

    url := fmt.Sprintf("%s://%s%s", proxyScheme, proxyHost, req.RequestURI)
    proxyReq, err := http.NewRequest(req.Method, url, bytes.NewReader(body))

    proxyReq.Header = make(http.Header)
    for h, val := range req.Header {
        proxyReq.Header[h] = val
    }

    resp, err := httpClient.Do(proxyReq)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadGateway)
        return
    }
    defer resp.Body.Close()

    // legacy code
}

Cette approche garantit que les versions anciennes et nouvelles du serveur reçoivent des demandes en double sans modifier la demande d'origine.

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!

Déclaration:
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