优雅的停止golang 应用
通过信号处理,让golang 应用优雅的退出。
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")
}