Introduction
Dans ce tutoriel, nous allons créer un reverse proxy en Go en utilisant le package httputil
.
Un reverse proxy est particulièrement utile pour gérer le load balancing, le caching, ou encore pour ajouter une couche de sécurité devant vos services backend.
Le code complet est disponible sur Hypercommit.
Qu'est-ce qu'un reverse proxy ?
Un reverse proxy est un serveur qui se place devant vos serveurs backend et achemine les requêtes des clients vers les serveurs appropriés.
Il permet de gérer le load balancing, le caching, et la sécurité.
Étape 1 : Initialiser le projet
Commencez par créer un nouveau dossier et initialiser un module Go :
mkdir reverse-proxy
cd reverse-proxy
go mod init hypercommit.com/votre-username/reverse-proxy
Étape 2 : Créer le fichier main.go
Créez un fichier main.go
et ajoutez le code de base :
package main
import (
"log"
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
// URL du serveur backend
target, err := url.Parse("http://localhost:8080")
if err != nil {
log.Fatal(err)
}
// Créer le reverse proxy
proxy := httputil.NewSingleHostReverseProxy(target)
// Démarrer le serveur sur le port 3000
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
proxy.ServeHTTP(w, r)
})
log.Println("Reverse proxy démarré sur :3000")
log.Fatal(http.ListenAndServe(":3000", nil))
}
Vous pouvez maintenant tester avec go run main.go
.
Étape 3 : Customiser les requêtes
Ajoutez un Director
personnalisé pour modifier les headers des requêtes. Modifiez votre main.go
après la création du proxy :
// Créer le reverse proxy
proxy := httputil.NewSingleHostReverseProxy(target)
// Customiser les requêtes
proxy.Director = func(req *http.Request) {
req.URL.Scheme = target.Scheme
req.URL.Host = target.Host
req.Host = target.Host
req.Header.Set("X-Forwarded-Host", req.Header.Get("Host"))
req.Header.Set("X-Origin-Host", target.Host)
}
Étape 4 : Gérer les erreurs
Il est essentiel de gérer les erreurs de connexion au backend. Ajoutez un ErrorHandler
juste après le Director
:
// Gérer les erreurs
proxy.ErrorHandler = func(w http.ResponseWriter, r *http.Request, err error) {
log.Printf("Erreur proxy: %v", err)
w.WriteHeader(http.StatusBadGateway)
w.Write([]byte("Service indisponible"))
}
Tester votre reverse proxy
Pour tester, lancez d'abord un serveur backend sur le port 8080, puis démarrez votre proxy :
go run main.go
Votre reverse proxy est maintenant opérationnel sur le port 3000 !
Conclusion
httputil.ReverseProxy
offre une solution élégante et performante pour créer un reverse proxy en Go.
En quelques étapes simples, vous obtenez un proxy fonctionnel que vous pouvez ensuite customiser selon vos besoins.
Pour aller plus loin, consultez la documentation officielle et rejoins notre Discord !