很高兴Go 1.8发布了,这是个值得庆祝的日子。golang
如何优雅的关闭http服务在Go Web开发中一直被说起和讨论的话题,今天Go 1.8的发布终于为咱们带来了这个特性。code
文档中是这样介绍的:server
func (srv *Server) Shutdown(ctx context.Context) error
Shutdown
将无中断的关闭正在活跃的链接,而后平滑的中止服务。处理流程以下:开发
首先关闭全部的监听文档
而后关闭全部的空闲链接get
而后无限期等待链接处理完毕转为空闲,并关闭it
若是提供了 带有超时的Context
,将在服务关闭前返回 Context
的超时错误import
须要注意的是,Shutdown
并不尝试关闭或者等待 hijacked
链接,如 WebSockets
。若是须要的话调用者须要分别处理诸如长链接类型的等待和关闭。sed
其实,你只要调用 Shutdown
方法就行了。List
简单示例:
// main.go package main import ( "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World, %v\n", time.Now()) }) s := &http.Server{ Addr: ":8080", Handler: http.DefaultServeMux, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 << 20, } go func() { log.Println(s.ListenAndServe()) log.Println("server shutdown") }() // Handle SIGINT and SIGTERM. ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM) log.Println(<-ch) // Stop the service gracefully. log.Println(s.Shutdown(nil)) // Wait gorotine print shutdown message time.Sleep(time.Second * 5) log.Println("done.") }
运行程序:
go run main.go
而后 ctrl + c
终止该程序,会打印出以下信息:
2017/02/17 11:36:28 interrupt 2017/02/17 11:36:28 <nil> 2017/02/17 11:36:28 http: Server closed 2017/02/17 11:36:28 server shutdown
能够看到,服务被正确关闭了。
在没有 Shutdown
方法以前,ctrl + c
就硬生生的终止了,而后就没有而后了。
更多内容见官方文档: