我正在嘗試處理每個請求的上下文超時。我們有以下服務器結構:使用golang的每個請求上下文超時實現
流程概述:
圍棋服務器:基本上,充當[反向代理]。 2
驗證服務器:檢查請求驗證。
應用服務器:核心請求處理邏輯。
現在,如果授權服務器無法在規定的時間內處理請求,那麼我想關閉內存中的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)的超時值,那將會很棒。
感謝您的回答。它按預期工作。但是我們也有請求處理的reverse_proxy。您能否更新帶有上下文的反向代理的答案? – Avinash
你應該嘗試自己實現它。這樣你可能會明白髮生了什麼事。如果你失敗,那麼你來堆棧溢出。我們不在這裏做你的工作。我們在這裏幫你做好你的工作:D –
哈哈,我已經完成了這些任務。感謝您去內部澄清。 – Avinash