Senior
Πώς πρέπει να σχεδιαστεί ένας διακομιστής HTTP σε Go για να υποστηρίζει ομαλό τερματισμό και σωστό καθαρισμό πόρων;
sobes.tech AI
Απάντηση από AI
Για την υποστήριξη μιας ομαλής διακοπής (graceful shutdown) ενός HTTP διακομιστή σε Go, πρέπει να χρησιμοποιήσετε ένα πλαίσιο με ακύρωση και τη μέθοδο Shutdown από το πακέτο net/http. Αυτό επιτρέπει την σωστή ολοκλήρωση των τρεχουσών αιτήσεων και την απελευθέρωση πόρων πριν από το τερματισμό του διακομιστή.
Παράδειγμα:
srv := &http.Server{Addr: ":8080", Handler: myHandler}
// Εκκίνηση του διακομιστή σε μια ξεχωριστή goroutine
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("ListenAndServe(): %v", err)
}
}()
// Αναμονή για το σήμα τερματισμού
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit
// Δημιουργία ενός πλαισίου με χρονικό όριο για το shutdown
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Κλήση της Shutdown για ομαλό τερματισμό
if err := srv.Shutdown(ctx); err != nil {
log.Fatalf("Server Shutdown Failed:%+v", err)
}
log.Println("Ο διακομιστής τερματίστηκε σωστά")
Αυτή η προσέγγιση διασφαλίζει ότι ο διακομιστής δεν θα διακόψει ενεργές συνδέσεις, αλλά θα τις ολοκληρώσει σωστά, θα απελευθερώσει πόρους και θα τερματίσει την λειτουργία του.