Reverse Proxy Beispiel
This commit is contained in:
parent
ee934e1baf
commit
075b9113bc
11
README.md
11
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -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))
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
Loading…
Reference in New Issue