Go HTTP : transfert des requêtes entrantes vers un autre serveur
Supposons que vous ayez des services hérités et versionnés ("legacy" et "version_2_of_doom") en cours d'exécution côte à côte. Vous souhaitez que toutes les requêtes POST soient traitées simultanément par les deux services pour une transition en douceur.
Au départ, vous avez tenté de modifier le gestionnaire de l'ancien service pour dupliquer directement la requête vers "version_2_of_doom". Cependant, cette approche a échoué avec l'erreur « http : Request.RequestURI ne peut pas être défini dans les demandes des clients. »
La solution préférée consiste à créer une nouvelle demande et à copier uniquement les parties nécessaires de la demande entrante. Ce processus ressemble à ce que fait un proxy inverse, que vous pouvez examiner dans le package "net/http/httputil".
Voici un exemple d'implémentation :
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 vous permet de sélectionner de manière sélective copiez les en-têtes et créez un nouvel URI de demande à envoyer à l'autre serveur. En suivant ce modèle, vous pouvez transférer de manière transparente les requêtes HTTP entrantes vers plusieurs services sans modifier les détails de la requête.
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!