我正在尝试处理每个请求的上下文超时。我们有以下服务器结构:
流程概述:
去服务器:基本上,充当[反向代理]。2 https://en.wikipedia.org/wiki/Reverse_proxy
认证服务器:检查请求身份验证。
应用服务器:核心请求处理逻辑。
现在,如果授权服务器无法在规定的时间内处理请求,那么我想从内存中关闭 goroutine。
这是我尝试过的:
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
req, _ := http.NewRequest("GET", authorizationServer, nil)
req.Header = r.Header
req.WithContext(ctx)
res, error := client.Do(req)
select {
case <-time.After(10 * time.Second):
fmt.Println("overslept")
case <-ctx.Done():
fmt.Println(ctx.Err()) // prints "context deadline exceeded"
}
在这里,上下文返回为“超过最后期限“,如果请求没有在规定的时间内处理。但它继续处理该请求并在超过指定的时间内返回响应。那么,当超过时间时,如何停止请求流(goroutine)。
我还需要使用以下代码在 60 秒内处理完整的请求:
var netTransport = &http.Transport{
Dial: (&net.Dialer{
Timeout: 60 * time.Second,
}).Dial,
TLSHandshakeTimeout: 60 * time.Second,
}
client := &http.Client{
Timeout: time.Second * 60,
Transport: netTransport,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
那么我还需要任何单独的上下文实现吗?
Note1:如果我们可以使用上下文来管理 HTTP 服务器创建的每个请求(goroutine)的超时,那就太棒了。