Sobes.tech
Senior

Jak powinien być zaprojektowany serwer HTTP w Go, aby obsługiwał łagodne zamknięcie i odpowiednie czyszczenie zasobów?

sobes.tech AI

Odpowiedź od AI

Aby obsłużyć graceful shutdown serwera HTTP w Go, należy użyć kontekstu z anulowaniem i metody Shutdown z pakietu net/http. Pozwala to na poprawne zakończenie obsługi bieżących żądań i zwolnienie zasobów przed zatrzymaniem serwera.

Przykład:

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

// Uruchom serwer w osobnej goroutine
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Czekaj na sygnał zakończenia
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Utwórz kontekst z limitem czasu dla zamknięcia
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Wywołaj Shutdown dla graceful shutdown
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Serwer poprawnie wyłączony")

Ten sposób gwarantuje, że serwer nie przerwie aktywnych połączeń, a poprawnie je zakończy, zwolni zasoby i zakończy pracę.