优雅地重启或停止

你想优雅地重启或停止 web 服务器吗?有一些方法可以做到这一点。

我们可以使用 fvbock/endless 来替换默认的 ListenAndServe。更多详细信息,请参阅 issue #296

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

替代方案:

  • manners:可以优雅关机的 Go Http 服务器。
  • graceful:Graceful 是一个 Go 扩展包,可以优雅地关闭 http.Handler 服务器。
  • grace:Go 服务器平滑重启和零停机时间部署。

如果你使用的是 Go 1.8,可以不需要这些库!考虑使用 http.Server 内置的 Shutdown() 方法优雅地关机. 请参阅 gin 完整的 graceful-shutdown 示例。

  1. // +build go1.8
  2. package main
  3. import (
  4. "context"
  5. "log"
  6. "net/http"
  7. "os"
  8. "os/signal"
  9. "time"
  10. "github.com/gin-gonic/gin"
  11. )
  12. func main() {
  13. router := gin.Default()
  14. router.GET("/", func(c *gin.Context) {
  15. time.Sleep(5 * time.Second)
  16. c.String(http.StatusOK, "Welcome Gin Server")
  17. })
  18. srv := &http.Server{
  19. Addr: ":8080",
  20. Handler: router,
  21. }
  22. go func() {
  23. // 服务连接
  24. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  25. log.Fatalf("listen: %s\n", err)
  26. }
  27. }()
  28. // 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
  29. quit := make(chan os.Signal)
  30. signal.Notify(quit, os.Interrupt)
  31. <-quit
  32. log.Println("Shutdown Server ...")
  33. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  34. defer cancel()
  35. if err := srv.Shutdown(ctx); err != nil {
  36. log.Fatal("Server Shutdown:", err)
  37. }
  38. log.Println("Server exiting")
  39. }

Last modified 07.03.2020 : add blog dir (#115) (f46734b)