From ecf2bd6b553630c817728b4118c81953cfa98948 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Thu, 17 Apr 2025 18:31:04 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E8=AF=95=E8=A7=84=E5=88=99=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=85=8D=E7=BD=AE=E6=8C=87=E5=AE=9A=20http=20code=20/?= =?UTF-8?q?=20business=20code=20=E9=87=8D=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- httpclient/client.go | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/httpclient/client.go b/httpclient/client.go index 6abab1b..7f930ee 100644 --- a/httpclient/client.go +++ b/httpclient/client.go @@ -37,6 +37,14 @@ func NewHttpClient(reqConfig *define.Request, cacheInstance cache.ICache) (*Http if err := validate.RequestConfig(reqConfig); nil != err { return nil, err } + if reqConfig.RetryRule == nil { + reqConfig.RetryRule = &define.RequestRetryRule{ + RetryCount: 0, + RetryTimeInterval: 0, + RetryHttpCodeList: []int64{}, + RetryBusinessCodeList: []string{}, + } // 未指定重试规则, 则使用默认重试规则 + } if len(reqConfig.Static) > 0 { for loc, valMap := range reqConfig.Static { if len(valMap) == 0 { @@ -276,6 +284,16 @@ func (hc *HttpClient) requestBackendApi() *define.Response { response.RequestFinishTime = 0 // 清空完成时间 response.Seq++ response.RequestCount++ + retryHttpCodeTable := make(map[int64]bool) + retryBusinessCodeTable := make(map[string]bool) + if nil != hc.reqConfig.RetryRule { + for _, httpCode := range hc.reqConfig.RetryRule.RetryHttpCodeList { + retryHttpCodeTable[httpCode] = true + } + for _, businessCode := range hc.reqConfig.RetryRule.RetryBusinessCodeList { + retryBusinessCodeTable[businessCode] = true + } + } if response.RestyResponse, err = hc.request.Send(); nil != err { errType := define.RequestFailTypeSend if err.Error() == resty.ErrRateLimitExceeded.Error() { @@ -293,6 +311,10 @@ func (hc *HttpClient) requestBackendApi() *define.Response { // 命中限流就不重试了 break } + if len(retryHttpCodeTable) > 0 && !retryHttpCodeTable[499] { + // 未配置超时重试 + break + } time.Sleep(time.Duration(hc.reqConfig.RetryRule.RetryTimeInterval) * time.Millisecond) continue } @@ -309,7 +331,8 @@ func (hc *HttpClient) requestBackendApi() *define.Response { hc.fillResponseHeader(response) hc.fillResponseCookie(response) hc.fillResponseBody(response) - if response.HttpCode != http.StatusOK { + if response.HttpCode < http.StatusOK || response.HttpCode >= http.StatusMultipleChoices { + // 非 2xx errType := define.RequestFailTypeServerError if response.HttpCode/100 == 4 { // 客户端错误 @@ -319,6 +342,10 @@ func (hc *HttpClient) requestBackendApi() *define.Response { Type: errType, Message: "http code is " + response.HttpCodeStatus + ", not success", } + if len(retryHttpCodeTable) > 0 && !retryHttpCodeTable[int64(response.HttpCode)] { + // 未配置http code重试 + break + } time.Sleep(time.Duration(hc.reqConfig.RetryRule.RetryTimeInterval) * time.Millisecond) continue } @@ -327,6 +354,10 @@ func (hc *HttpClient) requestBackendApi() *define.Response { Type: define.RequestFailTypeBusinessError, Message: "business code is " + response.Code + ", not success", } + if len(retryBusinessCodeTable) > 0 && !retryBusinessCodeTable[response.Code] { + // 未配置业务code重试 + break + } time.Sleep(time.Duration(hc.reqConfig.RetryRule.RetryTimeInterval) * time.Millisecond) continue }