需求:
golang实现proxy来做到前端请求某个url后落到proxy上,proxy再发起请求到backend server, 然后为了性能问题, 我需要考虑超时后放弃后端返回,以及提醒http client超时(504)
我的思路:
因为整个程序用到了gin以及golang http包的reverseProxy,所以我优先考虑gin的http.server参数: readtimeout
, writetimeout
,
为此我写了一段代码如下:
package main
import (
"github.com/gin-gonic/gin"
"net/http" "time"
)
func main() {
e := gin.New()
e.GET("/", func(context *gin.Context) {
time.Sleep(time.Second * 5)
context.String(300, "ssss")
})
srv := http.Server{
Addr: ":8888",
Handler: e,
ReadTimeout: 3 * time.Second,
WriteTimeout: 3 * time.Second,
}
//http.TimeoutHandler(e, time.Second * 1, "msg")
srv.ListenAndServe()
}
另我意外的是: 我请求: http://localhost:8888 后浏览器卡了10s,返回ERR_EMPTY_RESPONSE
, 同时奇怪的又自主发起了一次请求,然后还是10s无结果
我的预期结果是: http server 3s无结果writer,则超时,浏览器应该也是超时停止请求,并拿到504
所以请教下大佬们,那里出了问题
writeTimeout 超时会导致服务器内部返回结果的时候(
response.Write()
)不能正常写回数据,但是不会导致引起整个请求 504 ,也不会在“超时”之后终止连接。