当前位置:首页 > 实用技巧 >

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

来源:原点资讯(www.yd166.com)时间:2023-06-15 14:03:12作者:YD166手机阅读>>

怎么关闭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 ") }

  • 代码1 注册path与处理器,代码2创建httpserver,在端口9090监听服务请求
  • 代码4 启动http服务,然后main函数所在协程就会阻塞了。
  • 代码3 异步协程模拟优雅停服。这里先休眠1分钟,是为了在1分钟让服务器可以正常接受请求处理。1分钟后,调用了server的shutdown方法,执行优雅停服,停服成功后,代码4会返回ErrServerClosed错误。

三、shutdown内部逻辑

  • 首先关闭所有开启的监听器,然后关闭所有闲置连接,最后等待活跃的连接均闲置了才终止服务。
  • 如果传入的 context 在服务完成终止前已超时了,那么 Shutdown 方法返回 context 的错误,否则返回任何由关闭服务监听器所引起的错误。
  • 另外当 Shutdown 方法被调用时,Serve、ListenAndServe 及 ListenAndServeTLS 方法会立刻返回 ErrServerClosed 错误。所以需要确保 Shutdown 未返回时,main函数所在的协程不要退出。我们示例中代码代码3.3和代码5保证了这个
  • 对 WebSocket 等的长连接,Shutdown 不会尝试关闭也不会等待这些连接关闭。若需要关闭,需调用者分开额外处理(诸如通知诸长连接或等待它们关闭,使用 RegisterOnShutdown 注册终止通知函数)。
  • 一旦对 server 调用了 Shutdown,其就不可再使用了(会报 ErrServerClosed 错误)。
四、总结

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

栏目热文

http如何打开端口

http如何打开端口

浏览器端发起 HTTP 请求流程构建请求 浏览器构建请求报文信息,构建好后,浏览器准备发起网络请求行GET /index...

2023-06-15 14:23:00查看全文 >>

http端口怎么设置(http端口一般设置为多少)

http端口怎么设置(http端口一般设置为多少)

虽然接触互联网的朋友经常使用代理服务器,但许多人可能还不知道端口,不同的代理使用不同的端口。有时,当我们设置代理时,无法...

2023-06-15 14:04:16查看全文 >>

怎么启动http服务(怎样运行http服务器)

怎么启动http服务(怎样运行http服务器)

有时候在局域网会有给别人分享文件的需求,这时候如果用微信、QQ之类的,还需要去打开软件,打包发送的操作,而如果你的电脑安...

2023-06-15 14:04:19查看全文 >>

http关闭还是打开好(http可以打开吗)

http关闭还是打开好(http可以打开吗)

Everything是个桌面平台的文件索引和搜索神器,在索引完成后输入文件名可以快速找到用户需要的各种文件等。这款非常知...

2023-06-15 13:47:49查看全文 >>

http服务开启命令

http服务开启命令

任意目录执行以下命令,即可开启一个HTTP服务,操作非常简单。python3 # python3 -m http.ser...

2023-06-15 14:16:37查看全文 >>

关闭http服务很久关不上(服务器怎么开启http服务)

关闭http服务很久关不上(服务器怎么开启http服务)

之前漏洞扫描发现的问题,我使用的是apache服务器在配置中增加以下内容解决了这个漏洞。<Location ...

2023-06-15 14:13:48查看全文 >>

http服务怎么重启

http服务怎么重启

Florian von Bock[1] 已将本文中描述的内容实现成了一个名为Endless[2]的 Go 程序包。对于 ...

2023-06-15 14:26:06查看全文 >>

如何把http添加到受信任站点

如何把http添加到受信任站点

一、基本要求: 1.熟悉电脑基本操作; 2.具有互联网基础知识,会上网,熟悉IE浏览器的基本操作; 3.使用前,请把本...

2023-06-15 13:47:07查看全文 >>

绝地求生轻量版安卓手机怎么下(绝地求生轻量版最新版本下载手机)

绝地求生轻量版安卓手机怎么下(绝地求生轻量版最新版本下载手机)

绝地求生Mobile Lite在哪下载?绝地求生轻量版有什么特色呢?还不清楚的小伙伴看过来,这里52z飞翔网小编为大家...

2023-06-15 14:22:10查看全文 >>

绝地求生轻量版怎么改成中文(绝地求生轻量版下载)

绝地求生轻量版怎么改成中文(绝地求生轻量版下载)

想必不少网友都听过PUBG LITE这款游戏吧,这款游戏其实是低配版的绝地求生,最初仅在泰国地区开启测试,这款游戏对电脑...

2023-06-15 13:55:16查看全文 >>

文档排行