package main import ( "context" "fmt" "net/http" "os" "os/signal" "time" "github.com/gin-gonic/gin" ) func main() { gin.SetMode(gin.ReleaseMode) engine := gin.New() engine.Use(gin.Logger()) engine.Use(gin.Recovery()) root := engine.Group("/api") root.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) maxHeaderBytes := 1 << 20 server := &http.Server{ Addr: "0.0.0.0:8000", Handler: engine, ReadTimeout: time.Duration(30) * time.Second, WriteTimeout: time.Duration(30) * time.Second, MaxHeaderBytes: maxHeaderBytes, } go func() { if err := server.ListenAndServe(); err != nil { server.ErrorLog.Panicf("start server: %s\n", err.Error()) } }() // 信号处理 quit := make(chan os.Signal, 1) signal.Notify(quit, os.Interrupt) # 注册信号 <-quit // 等待接收信号 fmt.Println("shutdown server...") // dosomthing() // ... ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { fmt.Printf("server shutdown: %s", err.Error()) } fmt.Println("server exited") }