一尘不染

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

go

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

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,或者如果它抛出一个错误,并自行关闭。是否ListenAndServe()错误抛出,即使我用的Server.ShutDown()方法是什么?这就是为什么err != http.ErrServerClosed检查ListenAndServe()错误时在链接中使用可接受的答案吗?

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

4)打电话后Server.ShutDown(),我需要做些什么来关闭http.HandleFunc()听众?

对于这些主题中的任何帮助,将不胜感激,所以如果您无法一次接触所有内容,请不要担心:)

编辑:如果有人想看看我最终是如何使所有这些正常工作的,则可以查看此文件,第225行及以上。


阅读 554

收藏
2020-07-02

共1个答案

一尘不染

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

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

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

至于2)。该文档指出:

ListenAndServe始终返回非nil错误。

所以err != http.ErrServerClosed只是为了情况而工作Server.ShutDown()。但是可能还会发生其他错误。

4)没有任何事情可以关闭,http.HandleFunc()因为Server.ShutDown()它将等待正在处理的请求。

2020-07-02