Sobes.tech
Senior

Kā būtu jāizstrādā HTTP serveris Go valodā, lai atbalstītu gludu izslēgšanu un pareizu resursu tīrīšanu?

sobes.tech AI

Atbilde no AI

Lai nodrošinātu gludu HTTP servera aizvēršanu Go valodā, ir jāizmanto atsaukšanas konteksts un Shutdown metode no net/http pakotnes. Tas ļauj pareizi pabeigt pašreizējos pieprasījumus un atbrīvot resursus pirms servera apturēšanas.

Piemērs:

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

// Servera palaišana atsevišķā gorutīnā
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Gaidi signālu par aizvēršanu
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Izveido kontekstu ar laika ierobežojumu aizvēršanai
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Izsauc Shutdown, lai veiktu gludu aizvēršanu
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Serveris veiksmīgi aizvērts")

Šī pieeja nodrošina, ka serveris nepārtrauks aktīvās savienojumus, bet tos pareizi pabeigs, atbrīvos resursus un pārtrauks darbu.