Дождитесь запуска HTTP-сервера gin

#go #channel #goroutine #httpserver #go-gin

#Вперед #канал #подпрограмма #httpserver #перейти-gin

Вопрос:

Мы используем gin для предоставления некоторых REST API в рабочей среде. Теперь мне нужно кое-что сделать после запуска HTTP-сервера.

Я не очень хорошо знаком с каналами, но приведенный ниже код — это то, что я пытаюсь сделать. Как только startHTPPRouter() запустится HTTP-служба, я хочу отправить сигнал на main() . На основе этого сигнала я хочу выполнить некоторые другие действия.

Пожалуйста, дайте мне знать, что я делаю неправильно в приведенном ниже коде.

 func startHTTPRouter(routerChannel chan bool){
    router := gin.New()
    // Many REST API routes definitions
    router.Run("<port>")
    routerChannel <- true  // Is this gonna work ? Because Run() again launches a go routine for Serve()
}

func main() {
    routerChannel := make(chan bool)
    defer close(routerChannel)
    go startHTTPRouter(routerChannel )
    for {
        select {
        case <-routerChannel:
            doStuff()  // Only when the REST APIs are available.
            time.Sleep(time.Second * 5)
        default:
            log.Info("Waiting for router channel...")
            time.Sleep(time.Second * 5)
        }
    }
}
  

Комментарии:

1. Что starts означает?? 😛 как только он прослушивает и принимает сокет? Как только он прослушивается?

Ответ №1:

gin.New().Run() блокирует API. сервер gin не возвращается до завершения.

 func startHTTPRouter(routerChannel chan bool) {
    router := gin.New()
    router.Run("<port>")
    routerChannel <- true  // Is this gonna work ? Because Run() again launches a go routine for Serve()
}
  

Ниже приведен API gin’Run(). https://github.com/gin-gonic/gin/blob/master/gin.go

 // Run attaches the router to a http.Server and starts listening and serving HTTP requests.
// It is a shortcut for http.ListenAndServe(addr, router)
// Note: this method will block the calling goroutine indefinitely unless an error happens.
func (engine *Engine) Run(addr ...string) (err error) {
    defer func() { debugPrintError(err) }()

    address := resolveAddress(addr)
    debugPrint("Listening and serving HTTP on %sn", address)
    err = http.ListenAndServe(address, engine)
    return
}