dongtan5558
dongtan5558
2018-10-29 17:56
浏览 254
已采纳

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

I'm trying to implement server-side timeouts for my service. If the request takes longer than X seconds, the server should return 503 Service Unavailable.

I know that this can easily be accomplished by wrapping all of my endpoints in http.TimeoutHandler, but I'm confused why this isn't being done automatically by the Timeout fields of http.Server

Here is a trivial example that I am using for testing. If I cURL or POSTman this server, it hangs forever, rather than the 5 seconds I expect.

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()
}

EDIT: forgot to link some Cloudflare articles that I have been using as inspiration. complete guide to golang http timeouts so you want to expose go on the internet

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • dongqieli4164
    dongqieli4164 2018-10-29 20:15
    已采纳

    The answer is to use http.TimeoutHandler. I misunderstood the purpose of the http.Server Timeout fields.

    点赞 评论
  • qq_25519439
    qq_25519439 2020-05-21 22:52

    i meet same question, it return EOF rather than 503 or 504 status code when request time more than ReadtimeOut or WritetimeOut???
    why it can be this???please help me ,thanks

    点赞 评论

相关推荐