文章目录
- 一、什么是优雅关闭服务
- 二、使用函数
- 三、使用案例
一、什么是优雅关闭服务
先把在执行的任务执行完成,再关闭服务,防止中断服务造成程序错误,数据异常等影响。
二、使用函数
语法:
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")
}