Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang优雅HTTP服务器关闭并进行错误处理_Http_Go_Go Graceful - Fatal编程技术网

Golang优雅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

我正在让我的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,或者它是否抛出了一个错误并自行关闭。即使我使用了
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()
将等待处理完成的请求。

更多关于优雅关机的例子,我在这里看了一下,但对于到底发生了什么,仍然有所有这些未回答的问题。我现在一切都很顺利:)