Sobes.tech
Senior

Como deve ser projetado um servidor HTTP em Go para suportar uma desligada graciosa e uma limpeza adequada de recursos?

sobes.tech IA

Resposta da IA

Para suportar uma paragem graciosa num servidor HTTP em Go, deve usar um contexto com cancelamento e o método Shutdown do pacote net/http. Isto permite terminar corretamente o processamento das solicitações atuais e libertar recursos antes de parar o servidor.

Exemplo:

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

// Executar o servidor numa goroutine
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Aguardar o sinal de encerramento
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Criar um contexto com um tempo limite para o encerramento
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Chamar Shutdown para uma paragem graciosa
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Servidor encerrado corretamente")

Este método garante que o servidor não interrompa as ligações ativas, mas as termina corretamente, liberta recursos e termina a sua execução.