golang 优雅关闭服务
一、什么是优雅关闭服务
先把在执行的任务执行完成,再关闭服务,防止中断服务造成程序错误,数据异常等影响。
二、使用函数
语法:
func (srv *Server) Shutdown(ctx context.Context) error
作用: Shutdown优雅地关闭服务器,而不会中断任何活动连接。
工作原理: 首先关闭所有打开的侦听器,然后关闭所有空闲连接,然后无限期地等待连接恢复空闲状态,然后关闭。 如果提供的上下文在关闭完成之前过期,shutdown将返回上下文的错误,否则将返回关闭服务器底层侦听器返回的任何错误。
三、使用案例
例:
package main import ( "context" "log" "net/http" "os" "os/signal" "time" "syscall" "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, } go func() { // 服务连接 if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("listen: %s\n", err) } }() // 创建一个无缓冲通道 quit := make(chan os.Signal) signal.Notify(quit, syscall.SIGINT, syscall.SIGHUP, syscall.SIGTERM) // 在未接受到信号时,通道发生阻塞。 <-quit log.Println("Shutdown Server ...") // 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // 执行关闭服务操作 if err := srv.Shutdown(ctx); err != nil { log.Fatal("Server Shutdown:", err) } log.Println("Server exiting") }