Sobes.tech
Senior

Wie sollte ein HTTP-Server in Go gestaltet sein, um einen sanften Shutdown und eine ordnungsgemäße Ressourcenbereinigung zu unterstützen?

sobes.tech KI

Antwort von AI

Um einen geordneten Herunterfahren eines HTTP-Servers in Go zu unterstützen, muss man einen Kontext mit Abbruch verwenden und die Methode Shutdown aus dem Paket net/http. Dies ermöglicht es, die aktuellen Anfragen ordnungsgemäß abzuschließen und Ressourcen freizugeben, bevor der Server gestoppt wird.

Beispiel:

srv := &http.Server{Addr: ":8080", Handler: myHandler}

// Server in einer Goroutine starten
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Auf das Beenden-Signal warten
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Einen Kontext mit Timeout für das Herunterfahren erstellen
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Shutdown für einen geordneten Stopp aufrufen
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Server wurde ordnungsgemäß beendet")

Dieser Ansatz stellt sicher, dass der Server keine aktiven Verbindungen unterbricht, sondern sie ordnungsgemäß beendet, Ressourcen freigibt und den Betrieb einstellt.