manners
manners 为 HTTP server 提供优雅的关闭方案. 文档查看 DOC
其代码实现非常简洁, manners 简单复合了 net.Listener
和 net.Conn
, 支持通过 os.Signal
自动 shuts down, 或者由使用者触发关闭 HTTP server.
这里列举DOC中给出的方法
通过系统信号关闭. import os/signal
<!-- lang: cpp -->
func main() {
handler = MyHTTPHandler()
signal.Notify(manners.ShutdownChannel)
manners.ListenAndServe(handler, ":7000")
}
使用者触发关闭
<!-- lang: cpp -->
func main() {
handler = MyHTTPHandler()
baseListener, err := net.Listen(":7000")
if err != nil {
panic(err)
}
listener := manners.NewListener(baseListener)
manners.Serve(listener, handler)
}
// 当需要关闭的时候,可以这样
func ShutDown(){
manners.ShutdownChannel <- syscall.SIGINT
}
注意事项. StarRoutine 和 FinishRoutine
manners 在 shutdown 的时候要保障所有的请求都被处理完, 才可以 shutdown. 因此当你的 request handler 中要产生 Goroutine 时候需要这样使用
<!-- lang: cpp -->
func (this *MyHTTPHandler) ServeHTTP(response http.ResponseWriter, request *http.Request) {
// 其他代码
go newGoroutine()()
// 其他代码
}
// 你的goroutine 里面需要这样
func newGoroutine() {
manners.StartRoutine()
go func() {
defer manners.FinishRoutine()
}()
// 其他代码
}
2种使用方法, 1个注意事项, 一共就这么多.