// graceful/shutdown.go package graceful import ( "context" "log" "net/http" "os" "os/signal" "syscall" "time" "git.x2erp.com/qdy/go-base/container" "git.x2erp.com/qdy/go-base/logger" ) // WaitForShutdown 带可选清理函数的优雅关闭 func WaitForShutdown(serviceName string, containerFactory *container.ContainerFactory, servers ...*http.Server) { quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) log.Printf("按 Ctrl+C 停止服务 %s", serviceName) // 等待信号 <-quit log.Printf("接收到终止信号,正在优雅关闭服务 %s...", serviceName) //退出注册中心 //consul.Deregister(s.serviceName, s.Ip, s.Port, b.Cfg.GetConsulConfig()) // 创建关闭上下文,给30秒完成当前请求 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() for _, srv := range servers { p := srv.Addr if err := srv.Shutdown(ctx); err != nil { log.Printf("服务 %s 关闭失败: %v", p, err) } else { log.Printf("服务 %s 已关闭", p) } } // 停止接收新请求,完成当前请求 // 执行关闭处理 if containerFactory != nil { containerFactory.CloseAll() } // 停止日志写入 logger.StopESWriter() log.Printf("%s 服务全部优雅关闭完成", serviceName) // 等待一小段时间确保日志写入完成 time.Sleep(100 * time.Millisecond) os.Exit(0) }