errgroup 实现 http server启动和关闭

errgroup 实现 http server启动和关闭

问题描述

基于 errgroup 实现一个 http server 的启动和关闭 ,以及 linux signal 信号的注册和处理,要保证能够一个退出,全部注销退出。

实现方案

根据描述信息,可以简单汇总成3块内容:

  1. 实现 HTTP server 的启动和关闭
  2. 监听 linux signal信号,支持 kill -9 或 Ctrl+C 的中断操作操作
  3. errgroup 实现多个 goroutine 的级联退出

按照实现方案,我们将任务拆分成多个小的功能。

  1. 实现 http server 的启动和关闭功能
  2. 使用 chan 实现对 linux signal 中断的注册和处理
  3. 通过 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值