這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
很高興Go 1.8發布了,這是個值得慶祝的日子。
如何優雅的關閉http服務在Go Web開發中一直被提及和討論的話題,今天Go 1.8的發布終於為我們帶來了這個特性。
文檔中是這樣介紹的:
func (srv *Server) Shutdown(ctx context.Context) error
Shutdown
將無中斷的關閉正在活躍的串連,然後平滑的停止服務。處理流程如下:
需要注意的是,Shutdown
並不嘗試關閉或者等待 hijacked
串連,如 WebSockets
。如果需要的話調用者需要分別處理諸如長連線類型的等待和關閉。
其實,你只要調用 Shutdown
方法就好了。
簡單樣本:
// main.gopackage mainimport ( "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 interrupt2017/02/17 11:36:28 <nil>2017/02/17 11:36:28 http: Server closed2017/02/17 11:36:28 server shutdown
可以看到,服務被正確關閉了。
在沒有 Shutdown
方法之前,ctrl + c
就硬生生的終止了,然後就沒有然後了。
更多內容見官方文檔:
https://golang.org/pkg/net/ht...