Golang изящное завершение работы HTTP-сервера с обработкой ошибок - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь корректно завершить работу моего 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() внутри программы.Как я могу убедиться, что serverError() будет гарантировать завершение?Нужно ли делать какие-то блокировки в этом потоке или создать канал в главном потоке, который он может вызывать?

2) На данный момент я не уверен, есть ли у меня способсообщать, если у меня Server.ShutDown() http.Server, или он выдал ошибку и выключился сам.Выдается ли ошибка ListenAndServe(), даже если я использовал метод Server.ShutDown()?Вот почему принятый ответ в ссылке использует err != http.ErrServerClosed при проверке ошибки ListenAndServe()?

3) Функция start() (конечно) выполняется в главном потоке.Разве мне не нужно каким-то образом блокировать этот поток, чтобы программа не возвращалась и не выходила, или ListenAndServe() позаботился об этом для меня?

4) После вызова Server.ShutDown() нужно ли мнесделать что-нибудь, чтобы отключить http.HandleFunc() слушателей?

Любая помощь по любой из этих тем будет принята с благодарностью, поэтому не беспокойтесь, если вы не можете затронуть все сразу:)

РЕДАКТИРОВАТЬ: Если кто-то хочет увидеть, как я в итоге все это работает правильно, вы можете посмотреть этот файл , строка 225 и далее.

1 Ответ

0 голосов
/ 24 декабря 2018

main функция должна каким-то образом ждать всех процедур go, которые вы хотите полностью выполнить.

Итак, 1) вопрос: вы должны заблокировать основную подпрограмму, чтобы убедиться, что serverError может быть выполнено.

И 3) вопрос: абсолютно вы должны заблокировать start()или за пределами start() самостоятельно, или программа немедленно завершит работу.

Что касается 2).Документ указывает:

ListenAndServe всегда возвращает ненулевую ошибку.

, поэтому err != http.ErrServerClosed просто работает для ситуации Server.ShutDown().Тем не менее, возможны и другие ошибки.

4) Ничего не делать, чтобы выключить http.HandleFunc(), поскольку Server.ShutDown() будет ожидать запросов, которые выполняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...