Einleitung: Warum Ihr Go-Projekt einen Dirigenten braucht
\n\nStellen Sie sich ein Sinfonieorchester vor. Sie haben Geigen (Benutzerservice), Bläser (Bestellservice), Schlagzeug (Zahlungsservice). Jedes Instrument ist für sich genommen wunderbar, aber ohne Dirigenten spielen sie kreuz und quer. In der Welt der Mikroservices mit Go ist der API Gateway genau dieser Dirigent.
\n\nWenn Sie in Go programmieren, sind Sie an Leistung, Einfachheit und Eleganz gewöhnt. Aber sobald die Anzahl der Dienste 3–4 übersteigt, bricht das Chaos aus: Clients wissen nicht, an wen sie sich wenden sollen, die Authentifizierung wird in jedem Dienst dupliziert und das Monitoring wird zum Kopfschmerz. API Gateway für Go-Dienste löst all diese Probleme auf einmal.
\n\nIn diesem Artikel werden wir nicht nur über die Theorie sprechen. Wir nehmen Go, die Standardbibliothek und ein paar beliebte Pakete, um unser eigenes Gateway zu bauen. Bereit zu dirigieren? Los geht's!
\n\nWas ist ein API Gateway und warum braucht man es in Go?
\n\nAPI Gateway ist ein zentraler Einstiegspunkt für alle Client-Anfragen an Ihre Backend-Dienste. Stellen Sie sich vor, Sie haben:
\n\n- \n
user-service:8081— Registrierung und Profile \norder-service:8082— Warenkorb und Bestellungen \npayment-service:8083— Transaktionen \n
Ohne Gateway muss der Client die Adressen aller drei Dienste kennen. Mit einem API Gateway in Go klopft er nur an api.example.com an, und das Gateway entscheidet selbst, wohin die Anfrage geleitet wird.
Hauptfunktionen des Gateways
\n\n- \n
- Routing — Weiterleitung von Anfragen an den entsprechenden Dienst \n
- Authentifizierung und Autorisierung — Überprüfung von JWT-Tokens an einer Stelle \n
- Rate Limiting — Schutz vor DDoS und Überlastung \n
- Datenaggregation — Zusammenführen von Antworten mehrerer Dienste in eine \n
- Lastverteilung — Verteilung von Anfragen auf mehrere Instanzen \n
Go ist für diese Rolle ideal: Es ist leichtgewichtig, schnell und kann Tausende von Anfragen pro Sekunde auf einem einzigen Kern verarbeiten.
\n\nEin einfaches API Gateway in Go schreiben: Von der Idee zum Code
\n\nLasst uns ein minimales, aber funktionsfähiges Go API Gateway bauen. Wir verwenden nur die Standardbibliothek net/http und das Paket httputil.ReverseProxy für das Proxying.
Schritt 1: Basis-Routing
\n\nBeginnen wir einfach: Wir leiten Anfragen basierend auf dem Pfad an verschiedene Dienste weiter.
\n\npackage main\n\nimport (\n "log"\n "net/http"\n "net/http/httputil"\n "net/url"\n)\n\nfunc main() {\n // Benutzerservice\n userServiceURL, _ := url.Parse("http://localhost:8081")\n userProxy := httputil.NewSingleHostReverseProxy(userServiceURL)\n\n // Bestellservice\n orderServiceURL, _ := url.Parse("http://localhost:8082")\n orderProxy := httputil.NewSingleHostReverseProxy(orderServiceURL)\n\n http.HandleFunc("/api/users/", func(w http.ResponseWriter, r *http.Request) {\n log.Printf("Leite Anfrage an user-service weiter: %s", r.URL.Path)\n userProxy.ServeHTTP(w, r)\n })\n\n http.HandleFunc("/api/orders/", func(w http.ResponseWriter, r *http.Request) {\n log.Printf("Leite Anfrage an order-service weiter: %s", r.URL.Path)\n orderProxy.ServeHTTP(w, r)\n })\n\n log.Println("API Gateway gestartet auf :8080")\n log.Fatal(http.ListenAndServe(":8080", nil))\n}\n\n\nDieser Code erledigt bereits 80% der Arbeit: Jede Anfrage an /api/users/ geht an den user-service und an /api/orders/ an den order-service. Aber wo bleibt die Authentifizierung?
Schritt 2: Middleware für JWT hinzufügen
\n\nDie wahre Magie des API Gateway in Go geschieht in der Middleware. Fügen wir eine Überprüfung des JWT-Tokens vor dem Proxying hinzu.
\n\npackage main\n\nimport (\n "context"\n "log"\n "net/http"\n "net/http/htt