Ein einfaches Reverse-Proxy-Beispiel in Go
English
Deutsch
Dieses Beispiel zeigt dir einen Go-HTTP-Server, der Anfragen an einen Upstream-Server über einen HTTP-Client weiterleitet. Beachte, dass dieses Beispiel die Antworten des Upstream-Servers nicht streamt, sondern in den RAM lädt und dann an den Client ausliefert (daher musst du dieses Beispiel möglicherweise verbessern, wenn du große Dateien ausliefern möchtest).
Beachte auch, dass dieses Beispiel keine ordnungsgemäße Fehlerbehandlung für die Upstream-Anfrage implementiert, da es nur als Ausgangspunkt für dich gedacht ist, um deine eigene Reverse-Proxy-Implementierung zu entwickeln.
reverse_proxy.go
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// Anfrage ausführen
url := "https://techoverflow.net" + r.URL.Path
req, _ := http.NewRequest(r.Method, url, r.Body)
req.Header = r.Header
resp, _ := client.Do(req)
// Cleanup, wenn diese Funktion endet
defer resp.Body.Close()
// Header von Anfrage zu Antwort kopieren
header := w.Header()
for name, headers := range resp.Header {
// Alle Header mit einem Namen iterieren (z.B. Content-Type)
for _, hdr := range headers {
header.Add(name, hdr)
}
}
// Alle Antwortdaten in ein []byte einlesen
body, _ := ioutil.ReadAll(resp.Body)
// Header & Body schreiben
w.WriteHeader(resp.StatusCode)
w.Write(body)
})
// log.Fatal zeigt dir, ob es einen Fehler gibt, z.B. wenn
// der Port bereits verwendet wird
fmt.Println("Listening on port 8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}Weiterführende Literatur:
- Go net/http-Paket
- Iterating HTTP client response headers in Go (das wir als Grundlage für unseren Header-Kopiermechanismus verwenden)
Check out similar posts by category:
Go
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow