HTTP sunucusunu düzgün kapatmak
SIGINT veya SIGTERM geldiğinde yeni bağlantı almayı bırakıp açık istekleri bitiren Go sunucusu.
SIGINT veya SIGTERM geldiğinde yeni bağlantı almayı bırakıp açık istekleri bitiren Go sunucusu.
package main
import ( "context" "errors" "log" "net/http" "os/signal" "syscall" "time")
func main() { ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop()
srv := &http.Server{Addr: ":8080", Handler: http.DefaultServeMux}
go func() { if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { log.Fatal(err) } }()
<-ctx.Done()
shutdownCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() if err := srv.Shutdown(shutdownCtx); err != nil { log.Printf("kapatma hatası: %v", err) }}