Saltearse al contenido

Apagado o reinicio controlado del servidor web

Estas son algunas formas de reiniciar o detener el servidor web controladamente.

Se puede utilizar fvbock/endless para sustituir al ListenAndServe por defecto. Véase más detalles en #296.

[...]
router := gin.Default()
router.GET("/", handler)
endless.ListenAndServe(":4242", router)

Alternativas de endless:

  • manners: Un servidor HTTP para Go con apagado controlado.
  • graceful: Graceful es un paquete de Go que habilita el apagado controlado de un servidor http.Handler.
  • grace: Reinicio controlado y despliegue para servidores Go con libre de interrupción del servicio.

Si estás usando Go 1.8, no necesitas hacer uso de esta librería!. Considera el uso del método Shutdown() que viene incluído en http.Server para el apagado controlado. Véase el ejemplo de apagado controlado con Gin.

//go:build go1.8
// +build go1.8
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
time.Sleep(5 * time.Second)
c.String(http.StatusOK, "Welcome Gin Server")
})
srv := &http.Server{
Addr: ":8080",
Handler: router.Handler(),
}
go func() {
// service connections
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
}
}()
// Wait for interrupt signal to gracefully shutdown the server with
// a timeout of 5 seconds.
quit := make(chan os.Signal, 1)
// kill (no params) by default sends syscall.SIGTERM
// kill -2 is syscall.SIGINT
// kill -9 is syscall.SIGKILL but can't be caught, so don't need add it
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("Shutdown Server ...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Println("Server Shutdown:", err)
}
log.Println("Server exiting")
}