限流器使用中间件完成

This commit is contained in:
白茶清欢 2025-05-08 11:37:34 +08:00
parent bfbcecb498
commit 4767aeb504
3 changed files with 27 additions and 15 deletions

View File

@ -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

View File

@ -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")
)

View File

@ -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