net.http 包中的超時設置
服務端
app.Server.ReadTimeout
app.Server.WriteTimeout
是針對全部請求設置的選項
默認 net.http keepalived 開啓,超時時間爲 3 分鐘,以下
1942 type tcpKeepAliveListener struct {
1943 *net.TCPListener
1944 }
1945
1946 func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) {
1947 tc, err := ln.AcceptTCP()
1948 if err != nil {
1949 return
1950 }
1951 tc.SetKeepAlive(true)
1952 tc.SetKeepAlivePeriod(3 * time.Minute)
1953 return tc, nil
1954 }
沒看到保活超時的配置選項,生產環境能夠禁掉
針對每一鏈接,設置超時,能夠參考
客戶端
剛纔看了下,golang http 庫客戶端有5個超時設置,一個是 Client 裏面的
Timeout,一個是 Client 使用的 Transport 的
ResponseHeaderTimeout,還有三個是 Transport 內部的 Dialer 的超時設置,Timeout,KeepAlive,Deadline。
經過查看 golang 代碼發現,在執行 http 請求以前, 若是 Client.Timeout > 0,會使用 time.AfterFunc 定義一個回掉函數,超時後調用,此函數會取消正在進行中的請求。
Dialer 的 Timeout 和 Deadline 是鏈接超時時間,創建鏈接過程當中使用
發送請求,接收響應 分別由兩個協程處理。發送請求後,Transport 裏的超時時間 ResponseHeaderTimeout 開始計時,所以它指的是等待響應的超時時間。