errgroup 实现 http server启动和关闭
文章目录
问题描述
基于 errgroup 实现一个 http server 的启动和关闭 ,以及 linux signal 信号的注册和处理,要保证能够一个退出,全部注销退出。
实现方案
根据描述信息,可以简单汇总成3块内容:
- 实现 HTTP server 的启动和关闭
- 监听 linux signal信号,支持 kill -9 或 Ctrl+C 的中断操作操作
- errgroup 实现多个 goroutine 的级联退出
按照实现方案,我们将任务拆分成多个小的功能。
- 实现 http server 的启动和关闭功能
- 使用 chan 实现对 linux signal 中断的注册和处理
- 通过 errgroup + context 的形式,对 1、2中的 goroutine 进行级联注销
具体过程
实现 http server 的启动和关闭
一般的http server 启动
func helloServer(w http.ResponseWriter, req *http.Request){
io.WriteString(w,"hello,word!")
}
func main(){
http.HandleFunc("/hello", helloServer)
if err := http.ListenAndServer(":8080",nil); err!=nil{
log.Fatal("server start error: ", err)
}
}
http.ListenAndServer 其实最后调用的是 func (srv *Server) ListenAndServe() error {…},所以我们可以直接使用 srv *Server 来调用,代码如下
srv := &http.Server{Addr: ":9090"}
http.HandleFunc("/hello", HelloServer2)
fmt.Println("http server start")
if err := srv.ListenAndServer(); err!=nil{
log.Fatal("server start error: ", err)
}
//关闭 server
// srv.Shutdown(context.TODO())
使用 chan 实现对中断的注册和处理
通过 signal.Notify(…) 实现对中断信号量的监听,完整代码如下
func main(){
c := make(chan os.Signal