对比区别:
1. 原始的关停服务器:
2. 优雅关闭服务器:
ListenAndServe是不阻塞的。
监听关闭信号,如果获取到信号就把这个超时的上下文传入server的shutdown()里面,然后才正式退出,监听到信号到真正结束之前我们会首先会关闭这个时间段内重新进入的连接请求,且在超时时间内把之前已经接收到的请求执行完毕。
但是kill -9是捕获不到的,有关资料可查看我的另一篇博文。
package main
import (
"context"
"github.com/gin-gonic/gin"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
r := gin.Default()
r.GET("/test", func(c *gin.Context) {
//模拟超时请求
time.Sleep(10*time.Second)
c.String(200,"hello world!")
})
server := &http.Server{
Addr: "8080",
Handler: r,
}
go func() {
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed{
log.Fatalf("Listen:%s\n",err)
}
}()
quit := make(chan os.Signal)
signal.Notify(quit,syscall.SIGINT,syscall.SIGTERM)
<-quit
log.Println("shutdown server...")
ctx,cancel := context.WithTimeout(context.Background(),10*time.Second)
defer cancel()
if err := server.Shutdown(ctx);err!= nil {
log.Fatal("server shutdown: ",err)
}
log.Println("server exiting...")
}