导语:记录一下gin框架自动重启的办法
func main() {
pid := syscall.Getpid()
fmt.Println("Pid: ", pid)
router := gin.Default()
router.Use(middleware.Cors())
//分组 v1
v1 := router.Group(sc.Entry)
routers.Router(v1) // routers 为文件夹名。避免和上面router重复
//router.Run(sc.Port) // 监听并在 0.0.0.0:8080 上启动服务
fmt.Println("http://localhost" + sc.Port + sc.Entry)
// 定时任务
cron := make(chan struct{})
go service.Cron(cron)
// 启动http server
srv := &http.Server{
Addr: sc.Port,
Handler: router,
}
go func() {
// 服务连接
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
}
}()
// 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
//quit := make(chan os.Signal)
//signal.Notify(quit, os.Interrupt)
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGINT)
//<-quit
<-ch
log.Println("Shutdown Server ...")
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 restarting")
// 运行之后需要通过kill -9 $pid的方式杀死进程退出程序
cron <- struct{}{}
main()
}
参考
https://gin-gonic.com/zh-cn/docs/examples/graceful-restart-or-stop/