Sobes.tech
Senior

Hoe moet een HTTP-server in Go worden ontworpen om een soepele shutdown en juiste resource cleanup te ondersteunen?

sobes.tech AI

Antwoord van AI

Om een graceful shutdown van een HTTP-server in Go te ondersteunen, moet je een context met annulering gebruiken en de Shutdown-methode uit het net/http-pakket. Dit zorgt ervoor dat de huidige verzoeken correct worden afgehandeld en dat bronnen worden vrijgegeven voordat de server wordt gestopt.

Voorbeeld:

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

// Start de server in een aparte goroutine
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Wacht op het signaal om te stoppen
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Maak een context met timeout voor de shutdown
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Roep Shutdown aan voor een graceful stop
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Server is correct afgesloten")

Deze aanpak zorgt ervoor dat de server geen actieve verbindingen onderbreekt, maar deze correct afsluit, bronnen vrijmaakt en stopt.