Я пытаюсь реализовать тайм-ауты на стороне сервера для моего сервиса. Если запрос занимает больше X секунд, сервер должен вернуть 503 Service Unavailable.
Я знаю, что это легко сделать, обернув все мои конечные точки в http.TimeoutHandler , но я запутался, почему это не делается автоматически полями Timeout http .Server
Вот тривиальный пример, который я использую для тестирования. Если я проверяю или POSTman этот сервер, он зависает навсегда, а не 5 секунд, которые я ожидаю.
package main
import (
"net/http"
"time"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/timeouttest", func(_ http.ResponseWriter, _ *http.Request) {
// busy infinite loop
// for { _ = struct {}{}}
// non-busy infinite loop
select {}
})
srv := &http.Server{
Addr: "localhost:5000",
Handler: mux,
ReadTimeout: 5 * time.Second,
ReadHeaderTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
IdleTimeout: 90 * time.Second,
}
srv.ListenAndServe()
}
РЕДАКТИРОВАТЬ: забыл связать некоторые статьи Cloudflare, которые я использовал в качестве вдохновения.
полное руководство по тайм-аутам http-голанга
так что хотите выставить иди в инет