win10关闭server服务

一、前言
在Go语言的SDK中,net模块为我们搭建HTTP服务提供了极大的便利。一旦服务启动,调用协程便会进入阻塞状态,等待客户端的请求。那么,我们如何优雅地关闭已经启动的服务呢?这是我们需要探讨的问题。
二、优雅停服策略
假设我们有一个简单的HTTP服务,其中包含一个处理请求的函数`sayHello`和一个主函数`main`。接下来,我们将展示如何优雅地停止这个服务。
我们创建一个HTTP请求处理器并注册路径与处理器:
go
func sayHello(w http.ResponseWriter, r http.Request) {
fmt.Println("收到的请求路径:", r.URL.Path)
fmt.Fprintln(w, "你好,世界!")
然后在主函数中:
1. 创建HTTP服务器并指定的地址和处理器。
2. 启动一个异步协程来模拟优雅停服。这个协程首先休眠一分钟,让服务器有时间处理请求。然后调用`server.Shutdown`方法尝试优雅地关闭服务器。如果关闭过程中发生错误,则打印错误信息。通知主协程关闭已经完成。
3. 主函数启动HTTP服务并等待关闭信号。当接收到关闭信号后,主协程结束并打印“shutdown ok”。
三、shutdown内部逻辑详解
服务器的优雅关闭过程包括关闭所有打开的连接和空闲的处理器,并等待所有活跃的连接都变为空闲状态后再终止服务。如果传入的context在服务完成终止之前超时,Shutdown方返回context的错误。当Shutdown方法被调用时,Serve、ListenAndServe及ListenAndServeTLS方立即返回ErrServerClosed错误。我们需要确保在Shutdown返回之前,主函数所在的协程不会退出。在我们的示例代码中,通过代码3.3和代码5确保了这一点。
对于WebSocket等长期连接,Shutdown方法不会尝试关闭也不会等待这些连接的关闭。如果需要关闭这些连接,调用者需要分开进行额外的处理,例如通知长期连接或等待它们关闭,或者使用RegisterOnShutdown注册终止通知函数。一旦对服务器调用了Shutdown方法,就不能再使用了,否则会报ErrServerClosed错误。
使用shutdown方法可以实现优雅地停止服务,但需要确保主函数所在协程在优雅停服完成前不会退出。在Go语言中,主函数所在协程的退出意味着整个进程的退出,而这时可能优雅停服还未完成。我们需要谨慎处理服务的关闭过程,以确保服务的正常终止。
