Senior
Hogyan kell egy Go-ban írt HTTP szervert tervezni, hogy támogassa a zökkenőmentes leállást és a megfelelő erőforrás-eltávolítást?
sobes.tech MI
Válasz az MI-től
A Go nyelvű HTTP szervereknél a zökkenőmentes leállás támogatásához használjon lemondással ellátott kontextust és a net/http csomag Shutdown metódusát. Ez lehetővé teszi a jelenlegi kérések helyes befejezését és az erőforrások felszabadítását a szerver leállítása előtt.
Példa:
srv := &http.Server{Addr: ":8080", Handler: myHandler}
// A szerver indítása külön goroutine-ban
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("ListenAndServe(): %v", err)
}
}()
// A leállási jelzés várása
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit
// Kontextus létrehozása időkorláttal a leálláshoz
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// A Shutdown meghívása a zökkenőmentes leállításhoz
if err := srv.Shutdown(ctx); err != nil {
log.Fatalf("Server Shutdown Failed:%+v", err)
}
log.Println("A szerver megfelelően leállt")
Ez a megközelítés biztosítja, hogy a szerver ne szakítsa meg az aktív kapcsolatokat, hanem azokat helyesen zárja le, felszabadítja az erőforrásokat és leáll.