Senior
Kaip turėtų būti suprojektuotas HTTP serveris Go kalboje, kad palaikytų sklandų uždarymą ir tinkamą išteklių valymą?
sobes.tech AI
Atsakymas iš AI
Norint užtikrinti sklandų HTTP serverio uždarymą Go kalboje, reikia naudoti atšaukimo kontekstą ir Shutdown metodą iš net/http paketo. Tai leidžia teisingai užbaigti esamus užklausas ir išlaisvinti išteklius prieš serverio sustabdymą.
Pavyzdys:
srv := &http.Server{Addr: ":8080", Handler: myHandler}
// Serverio paleidimas atskiroje gorutinoje
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("ListenAndServe(): %v", err)
}
}()
// Laukti uždarymo signalo
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit
// Sukurti kontekstą su laiko limitu uždarymui
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Kviesti Shutdown teisingam uždarymui
if err := srv.Shutdown(ctx); err != nil {
log.Fatalf("Server Shutdown Failed:%+v", err)
}
log.Println("Serveris sėkmingai uždarytas")
Šis požiūris užtikrina, kad serveris neužbaigs aktyvių ryšių, o juos teisingai užbaigs, išlaisvins išteklius ir sustos.