Чтобы реализовать graceful shutdown Go HTTP сервера, используй метод http.Server.Shutdown() вместе с обработкой сигналов. Это позволяет серверу перестать принимать новые соединения, но при этом корректно завершить уже существующие запросы.
Реализация требует три главных элемента:
http.Serversignal.Notify()Shutdown() с контекстом, когда пришёл сигналsrv := &http.Server{Addr: ":8080"}
// Запусти сервер в горутине
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("Server error: %v", err)
}
}()
// Слушай interrupt сигналы (SIGINT, SIGTERM)
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
// Жди, пока придёт сигнал
<-c
// Gracefully shutdown с timeout
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
srv.Shutdown(ctx)
SIGINT и SIGTERM для более широкой совместимостиhttp.ErrServerClosed, чтобы отличить graceful shutdown от настоящих ошибокЭтот подход гарантирует zero downtime во время деплоев и предотвращает резкие разрывы соединений с клиентами.
Метод http.Server.Shutdown() немедленно прерывает все активные соединения и предотвращает установку новых.
Новый — ещё не проверен сообществом
Вы