如何实现服务器端超时? (对http.Server超时感到困惑)

时间:2018-10-29 17:56:31

标签: go

我正在尝试为我的服务实现服务器端超时。如果请求花费的时间超过X秒,则服务器应返回503 Service Unavailable。

我知道可以通过将所有端点包装在http.TimeoutHandler中来轻松实现,但是我很困惑为什么Timeout fields of http.Server不能自动完成此操作

这是我用于测试的一个简单示例。如果我使用cURL或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文章作为灵感。 complete guide to golang http timeouts so you want to expose go on the internet

1 个答案:

答案 0 :(得分:0)

答案是使用http.TimeoutHandler。我误解了http.Server超时字段的目的。