Golang正常关闭HTTP服务器并进行错误处理

时间:2018-12-23 23:35:02

标签: http go go-graceful

我正在使我的HTTP服务器正常关闭。我从here帖子中获取了一些技巧,到目前为止,我已经像这样设置了代码:

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)我在上面链接的答案指出“注意:下一行可能没有时间运行...”,用于goroutine中的ListenAndServe()错误处理。如何确保serverError()将保证完成?我需要在该线程上进行某种阻塞还是在它可以调用的主线程上建立一个通道?

2)截至目前,我不确定是否有办法告诉我Server.ShutDown() http.Server,还是抛出错误并自行关闭。即使我使用了ListenAndServe()方法,也会引发Server.ShutDown()错误吗?这就是为什么检查err != http.ErrServerClosed错误时链接中接受的答案使用ListenAndServe()的原因?

3)start()函数(当然)在主线程上运行。我是否不需要以某种方式阻止该线程,这样程序就不会返回并退出,或者ListenAndServe()会帮我解决这个问题吗?

4)致电Server.ShutDown()之后,我需要做些什么来关闭http.HandleFunc()侦听器吗?

在任何这些主题上提供的任何帮助将不胜感激,因此如果您无法一次接触所有内容,请不要担心:)

编辑:如果有人想看看我最终如何使这一切正常进行,您可以查看this file,第225行及以后的内容。

1 个答案:

答案 0 :(得分:2)

main函数应该以某种方式等待您要完全完成的所有go例程。

因此,1)问题:您应该阻塞主例程以确保可以执行serverError

还有3)问题:绝对您应该自己在start()start()之外阻止,否则程序将立即退出。

至于2)。该文档指出:

  

ListenAndServe总是返回非nil错误。

因此err != http.ErrServerClosed仅适用于情况Server.ShutDown()。但是可能还会发生其他错误。

4)无需关闭http.HandleFunc(),因为Server.ShutDown()将等待处理完成的请求。