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("Сервер быў правільна зачынены")

Гэты падыход гарантуе, што сервер не перарэзе актыўныя злучэнні, а правільна іх завершыць, вызваліць рэсурсы і спыніць працу.