本文共 1822 字,大约阅读时间需要 6 分钟。
以下将通过一个基于Gin框架的实际案例,详细说明如何在Go中实现服务器的优雅关闭。
var i = 0 func main() { router := gin.Default() // 创建两个路由:一个处理延迟请求,一个处理立即响应 router.GET("/", func(c *gin.Context) { time.Sleep(9 * time.Second) i++ c.JSON(http.StatusOK, gin.H{ "num": i, }) }) router.GET("/a", func(c *gin.Context) { i++ c.JSON(http.StatusOK, gin.H{ "num": i, }) }) srv := &http.Server{ Addr: ":8080", Handler: router, } // 在后台启动服务器,避免阻塞优雅关闭 go func() { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("listen: %s\n", err) } }() //监听终止信号 quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) si <- quit log.Println("Shutting down server...", si) // 进行优雅关闭 ctx, cancel := context.WithCancel(context.Background()) defer cancel() if err := srv.Shutdown(ctx); err != nil { log.Fatal("Server forced to shutdown:", err) } log.Println("Server exiting") } context.WithCancel 创建上下文,传递给 srv.Shutdown 方法。通过上述方法,我们可以在Go中实现服务器的优雅关闭,确保服务的平稳升级和维护。
转载地址:http://dwyoz.baihongyu.com/