Golang优雅HTTP服务器关闭并进行错误处理
我正在让我的HTTP服务器正常关闭。我从帖子中获取了一些技巧,目前为止,我的代码设置如下:Golang优雅HTTP服务器关闭并进行错误处理,http,go,go-graceful,Http,Go,Go Graceful,我正在让我的HTTP服务器正常关闭。我从帖子中获取了一些技巧,目前为止,我的代码设置如下: func start() { //...... //START HTTP/SOCKET LISTENER if settings.TLS { httpServer = makeServer("/wss", settings.TLS); } else { httpServer = makeServer("/ws", settings.TLS
func start() {
//......
//START HTTP/SOCKET LISTENER
if settings.TLS {
httpServer = makeServer("/wss", settings.TLS);
} else {
httpServer = makeServer("/ws", settings.TLS);
}
//...
}
func makeServer(handleDir string, tls bool) (*http.Server) {
server := &http.Server{Addr: settings.IP+":"+strconv.Itoa(settings.Port)}
http.HandleFunc(handleDir, socketInitializer)
if tls {
go func() {
err := server.ListenAndServeTLS(settings.CertFile, settings.PrivKeyFile)
if err != nil {
serverError(err)
}
}()
}else{
go func() {
err := server.ListenAndServe()
if err != nil {
serverError(err)
}
}()
}
//
return server
}
因此,我有一些关于这一切现在如何运作的问题:
1) 我在上面链接的答案指出,ListenAndServe()
goroutine内部的错误处理“注意:下一行可能没有时间运行…”。如何确保serverError()
将保证完成?我需要在该线程上执行某种阻塞,还是在主线程上创建一个它可以调用的通道
2) 到目前为止,我不确定我是否有办法判断我是否已经关闭了Server.ShutDown()
http.Server,或者它是否抛出了一个错误并自行关闭。即使我使用了Server.ShutDown()
方法,是否也会抛出ListenAndServe()
错误?这就是为什么链接中接受的答案使用err!=http.ErrServerClosed
在检查ListenAndServe()时是否出错
3) start()
函数(当然)在主线程上运行。我是否需要以某种方式阻止该线程,使程序不会返回并退出,或者ListenAndServe()
是否为我处理该问题
4) 调用Server.ShutDown()
之后,是否需要执行任何操作来关闭http.HandleFunc()
侦听器
如果您能在这些主题上提供任何帮助,我们将不胜感激,因此,如果您不能同时触及所有内容,请不要担心:)
编辑:如果有人想知道我是如何完成这一切的,你可以看看第225行等等。main
函数应该以某种方式等待你想要完全完成的所有go例程
因此,问题1:您应该阻塞主例程,以确保可以执行serverError
还有3)问题:你绝对应该自己封锁start()
或start()
外部,否则程序将立即退出
至于第二点)。文件指出:
ListendServe始终返回非零错误
所以err!=http.ErrServerClosed
只适用于情况Server.ShutDown()
。但也可能出现其他错误
4) 关闭http.HandleFunc()
无需任何操作,因为Server.ShutDown()
将等待处理完成的请求。更多关于优雅关机的例子,我在这里看了一下,但对于到底发生了什么,仍然有所有这些未回答的问题。我现在一切都很顺利:)