diff --git a/httpclient/client.go b/httpclient/client.go index d415aa0..273e969 100644 --- a/httpclient/client.go +++ b/httpclient/client.go @@ -97,9 +97,11 @@ func NewHttpClient(reqConfig *define.Request, reqOption *RequestOption) (*HttpCl reqConfig.Header = make(map[string]any) } if ua, exist := reqConfig.Header[consts.HeaderKeyUserAgent.String()]; !exist || nil == ua || fmt.Sprintf("%v", ua) == "" { - reqConfig.Header[consts.HeaderKeyUserAgent.String()] = "resty-v2@network/httpclient" + reqConfig.Header[consts.HeaderKeyUserAgent.String()] = "resty-v3@network/httpclient" } - restyClient, restyRequest := NewRestyClient(reqConfig) + restyClient, restyRequest := NewRestyClient(reqConfig, reqOption) + defer restyClient.Close() + hc := &HttpClient{ Client: restyClient, request: restyRequest, @@ -296,20 +298,12 @@ func (hc *HttpClient) requestBackendApi() *define.Response { response = hc.newResponse() response.Seq = i response.RequestCount = i + 1 - if nil != hc.reqOption.RateLimiter { - if !hc.reqOption.RateLimiter.Allow() { - response.FailInfo = &define.ResponseFailInfo{ - Type: define.RequestFailTypeRateLimit, - Message: "rate limit exceeded", - } - // 命中限流, 忽略重试 - log.RecordDebug("请求命中限流, 忽略重试策略, 不进行重试", nil, hc.reqCfg) - break - } - } if response.RestyResponse, err = hc.request.Send(); nil != err { errType := define.RequestFailTypeSend - if netErr, ok := err.(net.Error); ok { + if err.Error() == define.ErrRateLimitExceeded.Error() { + // 命中限流 + errType = define.RequestFailTypeRateLimit + } else if netErr, ok := err.(net.Error); ok { if netErr.Timeout() { // 请求超时 errType = define.RequestFailTypeTimeoutError diff --git a/httpclient/define/error.go b/httpclient/define/error.go index bee6f77..f9b327b 100644 --- a/httpclient/define/error.go +++ b/httpclient/define/error.go @@ -16,3 +16,8 @@ var ( ErrMethodIsEmpty = errors.New("METHOD_IS_EMPTY") // 请求 方法为空 ErrMethodIsNotSupport = errors.New("METHOD_IS_NOT_SUPPORT") // 请求 method不支持 ) + +var ( + // ErrRateLimitExceeded v2版本中命中流控的错误信息 + ErrRateLimitExceeded = errors.New("rate limit exceeded") +) diff --git a/httpclient/resty.go b/httpclient/resty.go index 987883c..1cd9757 100644 --- a/httpclient/resty.go +++ b/httpclient/resty.go @@ -75,12 +75,25 @@ func initRequestConfig(reqConfig *define.Request) { // Author : go_developer@163.com<白茶清欢> // // Date : 15:00 2024/5/31 -func NewRestyClient(reqConfig *define.Request) (*resty.Client, *resty.Request) { +func NewRestyClient(reqConfig *define.Request, reqOption *RequestOption) (*resty.Client, *resty.Request) { client := resty.New() request := client.R() if nil == reqConfig { return client, request } + // 限流处理, 增加限流中间件 + client.AddRequestMiddleware(func(client *resty.Client, request *resty.Request) error { + if nil != reqOption && nil != reqOption.RateLimiter { + // 未配置流控 + return nil + } + if !reqOption.RateLimiter.Allow() { + // 命中流控 + return define.ErrRateLimitExceeded + } + return nil + }) + initRequestConfig(reqConfig) // 初始化 + 格式化配置 client.SetAllowMethodGetPayload(true) // 配置 GET 请求允许带 Body client.SetAllowMethodDeletePayload(true) // 配置 DELETE 请求允许带 Body