Sobes.tech
Senior

Go'da bir HTTP sunucusu, nazik bir kapanış ve uygun kaynak temizliği destekleyecek şekilde nasıl tasarlanmalıdır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go dilinde HTTP sunucusunda düzgün kapanmayı desteklemek için iptal ile bir bağlam kullanmalı ve net/http paketinden Shutdown metodunu kullanmalısınız. Bu, mevcut isteklerin düzgün şekilde tamamlanmasını ve kaynakların serbest bırakılmasını sağlar, sunucu durdurulmadan önce.

Örnek:

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

// Sunucuyu ayrı bir goroutine'de başlat
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Kapanış sinyalini bekle
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Kapanış için zaman aşımı içeren bir bağlam oluştur
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Düzgün durdurma için Shutdown'u çağır
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Sunucu düzgün şekilde kapandı")

Bu yaklaşım, sunucunun aktif bağlantıları kesmesini engeller, onları düzgün şekilde sonlandırır, kaynakları serbest bırakır ve çalışmayı sonlandırır.