Einführung in Microservices mit Go
Die Microservice-Architektur ist zum De-facto-Standard für den Aufbau moderner verteilter Systeme geworden. Die Sprache Go (Golang) mit ihren leichtgewichtigen Goroutinen, hoher Leistung und einfacher Bereitstellung ist ideal für die Implementierung von Microservices. In diesem Artikel analysieren wir die Microservice-Architektur mit Go vom Konzept bis zur praktischen Umsetzung mit Codebeispielen.
Go bietet integrierte Unterstützung für Nebenläufigkeit, schnellen Start und kleine Binärdateigrößen – all dies ist für Microservices entscheidend. Wir betrachten, wie man einen Service entwirft, eine REST-API implementiert, Middleware hinzufügt und die Anwendung für die Containerisierung vorbereitet.
Microservice-Architektur mit Go
1. Projektstruktur
Die richtige Code-Organisation ist die Grundlage eines wartbaren Microservices. Empfohlene Struktur:
myservice/├── cmd/│ └── server/│ └── main.go # Einstiegspunkt├── internal/│ ├── handler/ # HTTP-Handler│ ├── service/ # Geschäftslogik│ ├── repository/ # Datenzugriff│ └── middleware/ # Zwischenhandler├── pkg/│ └── models/ # Gemeinsame Datenmodelle├── config/│ └── config.go # Konfiguration├── go.mod└── DockerfileDiese Struktur folgt den Prinzipien der Clean Architecture: handler → service → repository. Dies ermöglicht es, jede Schicht unabhängig zu testen.
2. Konfiguration und Start
Beginnen wir mit einem einfachen HTTP-Server unter Verwendung der Standardbibliothek net/http:
// cmd/server/main.gopackage main
import ( "fmt" "log" "net/http" "os")
func main() { port := os.Getenv("PORT") if port == "" { port = "8080" }
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, `{"status": "ok"}`) })
log.Printf("Server starting on :%s", port) log.Fatal(http.ListenAndServe(":"+port, nil))}Dies ist ein minimaler Microservice. Verwenden Sie für die Produktion einen Router mit Middleware-Unterstützung, z. B. gorilla/mux oder chi.
Praktische Implementierung eines Microservices
3. REST-API mit gorilla/mux
Installieren wir gorilla/mux und implementieren CRUD für die Entität "Benutzer":
// go.modmodule github.com/youruser/userservice
go 1.21
require github.com/gorilla/mux v1.8.1// internal/handler/user.gopackage handler
import ( "encoding/json" "net/http" "github.com/gorilla/mux")
type User struct { ID string `json:"id"` Name string `json:"name"` Age int `json:"age"`}
var users = []User{ {ID: "1", Name: "Alice", Age: 30},}
func GetUsers(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(users)}
func CreateUser(w http.ResponseWriter, r *http.Request) { var newUser User if err := json.NewDecoder(r.Body).Decode(&newUser); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } users = append(users, newUser) w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(newUser)}// cmd/server/main.go (Fortsetzung)package main
import ( "log" "net/http" "github.com/gorilla/mux" "yourproject/internal/handler")
func main() { r := mux.NewRouter() r.HandleFunc("/users", handler.GetUsers).Methods("GET") r.HandleFunc("/users", handler.CreateUser).Methods("POST")
log.Println("Server started on :8080") log.Fatal(http.ListenAndServe(":8080", r))}4. Middleware: Logging und Authentifizierung
Middleware ist ein wesentlicher Bestandteil von Microservices.