Senior
Comment un serveur HTTP en Go doit-il être conçu pour supporter un arrêt en douceur et un nettoyage approprié des ressources?
sobes.tech IA
Réponse de l'IA
Pour prendre en charge un arrêt gracieux d'un serveur HTTP en Go, il faut utiliser un contexte avec annulation et la méthode Shutdown du paquet net/http. Cela permet de terminer proprement le traitement des requêtes en cours et de libérer les ressources avant d'arrêter le serveur.
Exemple :
srv := &http.Server{Addr: ":8080", Handler: myHandler}
// Démarrer le serveur dans une goroutine
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("ListenAndServe(): %v", err)
}
}()
// Attendre le signal de terminaison
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit
// Créer un contexte avec un délai d'expiration pour la fermeture
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Appeler Shutdown pour un arrêt gracieux
if err := srv.Shutdown(ctx); err != nil {
log.Fatalf("Server Shutdown Failed:%+v", err)
}
log.Println("Serveur arrêté proprement")
Cette approche garantit que le serveur ne coupe pas les connexions actives, mais les termine proprement, libère les ressources et s'arrête.