Gin框架如何优雅的关机和重启
一、优雅的关机
1、为什么需要优雅的关机
优雅关机就是服务端关机命令发出后不是立即关机,而是等待当前还在处理的请求全部处理完毕后再退出程序,是一种对客户端友好的关机方式。而执行Ctrl+C关闭服务端时,会强制结束进程导致正在访问的请求出现问题。(给一段时间让请求访问完毕)
2、优雅关机的步骤
(1)定义管道来装信号
quit:=make(chan os.Signal,1) //Create a Chanel Get Sign
//First Send syscall.SIGTERM
//Syscall.SIGINT Like Ctrl+C
(2)设置需要接受哪些信号量才能通过管道
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) //Mustbe Get All Sign
<-quit //管道进行阻塞
log.Println("Shutdown Server ...") //When Get SignInt Start Kill
(3)设置等待最后时间
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) //Set 5s After Kill
defer cancel()
二、优雅重启
package main
import (
"log"
"net/http"
"time"
"github.com/fvbock/endless"
"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, "hello gin!")
})
// 默认endless服务器会监听下列信号:
// syscall.SIGHUP,syscall.SIGUSR1,syscall.SIGUSR2,syscall.SIGINT,syscall.SIGTERM和syscall.SIGTSTP
// 接收到 SIGHUP 信号将触发`fork/restart` 实现优雅重启(kill -1 pid会发送SIGHUP信号)
// 接收到 syscall.SIGINT或syscall.SIGTERM 信号将触发优雅关机
// 接收到 SIGUSR2 信号将触发HammerTime
// SIGUSR1 和 SIGTSTP 被用来触发一些用户自定义的hook函数
if err := endless.ListenAndServe(":8080", router); err!=nil{
log.Fatalf("listen: %s\n", err)
}
log.Println("Server exiting")
}
如果看完对自己有所帮助,请点赞支持,谢谢大家