Sobes.tech
Senior

Kuidas peaks olema Go keeles kirjutatud HTTP-server kavandatud, et toetada sujuvat sulgemist ja korralikku ressursside puhastamist?

sobes.tech AI

Vastus AI-lt

Selleks, et toetada HTTP-serveri Go keeles sujuvat sulgemist (graceful shutdown), tuleb kasutada tühistamise konteksti ja net/http paketist Shutdown meetodit. See võimaldab õigesti lõpetada praegused päringud ja vabastada ressursid enne serveri sulgemist.

Näide:

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

// Serveri käivitamine eraldi gorutinas
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Oodata sulgemissignaali
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Loo kontekst ajapiiranguga sulgemiseks
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Kutsu Shutdown õigeks sulgemiseks
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Server suleti õigesti")

See lähenemine tagab, et server ei katkesta aktiivseid ühendusi, vaid lõpetab need õigesti, vabastab ressursid ja lõpetab töö.