Sobes.tech
Senior

Как трябва да бъде проектиран HTTP сървър в Go, за да поддържа плавно изключване и правилно почистване на ресурсите?

sobes.tech AI

Отговор от AI

За поддръжка на плавно изключване (graceful shutdown) на HTTP сървър в Go, трябва да използвате контекст с отменяне и метода Shutdown от пакета net/http. Това позволява правилно завършване на текущите заявки и освобождаване на ресурсите преди спирането на сървъра.

Пример:

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

// Стартиране на сървъра в отделна горутина
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Изчакване на сигнал за прекратяване
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Създаване на контекст с таймаут за изключване
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Викаме Shutdown за плавно изключване
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Сървърът беше правилно изключен")

Този подход гарантира, че сървърът няма да прекъсне активните връзки, а ще ги завърши правилно, ще освободи ресурсите и ще спре работата си.