怎么关闭http服务,http服务怎么启动

首页 > 实用技巧 > 作者:YD1662023-06-15 14:03:12

怎么关闭http服务,http服务怎么启动(1)

一、前言

go-SDK内提供了net模块,让我们可以方便的搭建http服务,我们知道服务一旦启动,调用协程阻塞就等待了,然后等待接受客户端发来的请求。那么当我们想要停止服务时,如何优雅的关闭已经启动的服务那?

二、优雅停服

func sayHello(w http.ResponseWriter, r *http.Request) { fmt.Println("path", r.URL.Path) fmt.Fprintln(w, "hello world") } func main() { //1. 创建http请求处理器,并注册path与处理器 handler := http.NewServeMux() handler.HandleFunc("/hello", sayHello) //2. 创建httpserver server := &http.Server{Addr: ":9090", Handler: handler} // 用于实现通知等待模型 ShutdownFlag := make(chan int) //3. 异步协程,模拟优雅停服 go func() { //3.1 休眠1分钟,让服务器有1分钟时间可以处理请求 time.Sleep(time.Minute) fmt.Println("call shutdown") //3.2如果1分钟还没关闭完毕,则报错 ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() //3.3优雅关闭 err1 := server.Shutdown(ctx) if err1 != nil { fmt.Printfln(Err1) } //3.3通知main协程,关闭完毕,可以退出了 close(shutdownFlag) }() //4. 启动http服务 err := server.ListenAndServe() if err != http.ErrServerClosed { panic(err) } //5. 等待优雅关闭结束 <-shutdownFlag fmt.Println("shutdown ok ") }

三、shutdown内部逻辑

四、总结

使用shutdown方法可以优雅停服,但是需要保证main函数所在协程不能在停服完毕前就退出了,因为go中main函数所在协程退出意味着整个进程就退出了,而这时优雅停服可能还没完成。

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.