From 075b9113bc6a0cfbd933b678c18d5345b18f44e1 Mon Sep 17 00:00:00 2001 From: Marco Kittel Date: Sat, 28 Jun 2025 09:50:35 +0200 Subject: [PATCH] Reverse Proxy Beispiel --- README.md | 11 +++++++++++ cmd/shell/main.go | 24 ++++++++++++++++++++++++ cmd/websrv/main.go | 16 ++++++++++++++++ go.mod | 3 +++ proxy/proxy.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 98 insertions(+) create mode 100644 cmd/shell/main.go create mode 100644 cmd/websrv/main.go create mode 100644 go.mod create mode 100644 proxy/proxy.go diff --git a/README.md b/README.md index e69de29..96f6959 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,11 @@ +# +Zum Test Proxy und zwei Webserver auf Port 8081 und 8082 aufrufen. +## Proxy aufrufen +go run cmd/shell/main.go +## Webserver aufrufen +go run cmd/websrv/main.go 8081 +go run cmd/websrv/main.go 8082 + + + + diff --git a/cmd/shell/main.go b/cmd/shell/main.go new file mode 100644 index 0000000..36fc669 --- /dev/null +++ b/cmd/shell/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" + "log" + "net/http" + + "gittea.kittel.dev/marco/proxy/proxy" +) + +var ( + PORT = 8080 +) + +func main() { + targets := []string{ + "http://localhost:8081", + "http://localhost:8082", + } + p := proxy.NewProxy(targets) + log.Println("Reverse proxy started on %d", PORT) + portStr := fmt.Sprintf(":%d", PORT) + log.Fatal(http.ListenAndServe(portStr, p)) +} diff --git a/cmd/websrv/main.go b/cmd/websrv/main.go new file mode 100644 index 0000000..2ff3640 --- /dev/null +++ b/cmd/websrv/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + "net/http" + "os" +) + +func main() { + port := os.Args[1] + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello from backend %s", port) + }) + fmt.Println("Backend listening on port:", port) + http.ListenAndServe(":"+port, nil) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e3c6030 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module gittea.kittel.dev/marco/proxy + +go 1.24.4 diff --git a/proxy/proxy.go b/proxy/proxy.go new file mode 100644 index 0000000..d82a9f4 --- /dev/null +++ b/proxy/proxy.go @@ -0,0 +1,44 @@ +package proxy + +import ( + "log" + "net/http" + "net/http/httputil" + "net/url" + "sync/atomic" +) + +type Proxy struct { + targets []*url.URL + counter uint64 +} + +func NewProxy(targets []string) *Proxy { + parsed := []*url.URL{} + for _, t := range targets { + u, err := url.Parse(t) + if err != nil { + log.Fatalf("") + } + parsed = append(parsed, u) + } + return &Proxy{targets: parsed} +} + +func (p *Proxy) getNextTarget() *url.URL { + i := atomic.AddUint64(&p.counter, 1) + return p.targets[(int(i)-1)%len(p.targets)] +} + +func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { + target := p.getNextTarget() + proxy := httputil.NewSingleHostReverseProxy(target) + r.Host = target.Host + log.Printf("Weiterleitung der Anfrage %s %s --> %s", r.Method, r.URL.Path, target) + proxy.ErrorHandler = func(w http.ResponseWriter, r *http.Request, err error) { + log.Printf("!! Proxy error for %s: %v", r.URL.Path, err) + http.Error(w, "Reverse Proxy Error", http.StatusBadGateway) + } + + proxy.ServeHTTP(w, r) +}