限流器使用中间件完成
This commit is contained in:
parent
bfbcecb498
commit
4767aeb504
@ -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
|
||||
|
@ -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")
|
||||
)
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user