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

Go 如何实现服务器端超时?(对http.Server超时感到困惑),go,Go,我正在尝试为我的服务实现服务器端超时。如果请求时间超过X秒,服务器应返回503服务不可用 我知道这可以通过将我的所有端点封装在中轻松实现,但我不明白为什么这不是由 下面是一个我用于测试的简单示例。如果我卷曲或邮递这台服务器,它将永远挂起,而不是我预期的5秒钟 package main import ( "net/http" "time" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/tim

我正在尝试为我的服务实现服务器端超时。如果请求时间超过X秒,服务器应返回503服务不可用

我知道这可以通过将我的所有端点封装在中轻松实现,但我不明白为什么这不是由

下面是一个我用于测试的简单示例。如果我卷曲或邮递这台服务器,它将永远挂起,而不是我预期的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.TimeoutHandler
。我误解了
http.Server
Timeout字段的用途。

为什么您认为应该超时?超时适用于客户端速度太慢的情况,但您故意阻止服务器的处理程序代码,因此这些超时都不适用。您已经提到了正确的答案,即为整个处理程序本身设置一个超时。我支持@JimB的答案,即
http。TimeoutHandler
是处理这个问题的正确方法。@JimB我想我不完全理解
ReadTimeout
ReadHeaderTimeout
WriteTimeout
是什么意思。这仅仅是为了防范恶意客户吗?他们正是为了他们的名字所描述的
ReadTimeout
是读取请求时的超时,
ReadHeaderTimeout
是仅读取请求头的超时,
WriteTimeout
是写入响应的超时。您的处理程序在被阻止时没有读取或写入任何内容,您的处理程序也不能实际导致这些内容被阻止。