限流器使用中间件完成
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)
|
reqConfig.Header = make(map[string]any)
|
||||||
}
|
}
|
||||||
if ua, exist := reqConfig.Header[consts.HeaderKeyUserAgent.String()]; !exist || nil == ua || fmt.Sprintf("%v", ua) == "" {
|
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{
|
hc := &HttpClient{
|
||||||
Client: restyClient,
|
Client: restyClient,
|
||||||
request: restyRequest,
|
request: restyRequest,
|
||||||
@ -296,20 +298,12 @@ func (hc *HttpClient) requestBackendApi() *define.Response {
|
|||||||
response = hc.newResponse()
|
response = hc.newResponse()
|
||||||
response.Seq = i
|
response.Seq = i
|
||||||
response.RequestCount = i + 1
|
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 {
|
if response.RestyResponse, err = hc.request.Send(); nil != err {
|
||||||
errType := define.RequestFailTypeSend
|
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() {
|
if netErr.Timeout() {
|
||||||
// 请求超时
|
// 请求超时
|
||||||
errType = define.RequestFailTypeTimeoutError
|
errType = define.RequestFailTypeTimeoutError
|
||||||
|
@ -16,3 +16,8 @@ var (
|
|||||||
ErrMethodIsEmpty = errors.New("METHOD_IS_EMPTY") // 请求 方法为空
|
ErrMethodIsEmpty = errors.New("METHOD_IS_EMPTY") // 请求 方法为空
|
||||||
ErrMethodIsNotSupport = errors.New("METHOD_IS_NOT_SUPPORT") // 请求 method不支持
|
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<白茶清欢>
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
//
|
//
|
||||||
// Date : 15:00 2024/5/31
|
// 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()
|
client := resty.New()
|
||||||
request := client.R()
|
request := client.R()
|
||||||
if nil == reqConfig {
|
if nil == reqConfig {
|
||||||
return client, request
|
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) // 初始化 + 格式化配置
|
initRequestConfig(reqConfig) // 初始化 + 格式化配置
|
||||||
client.SetAllowMethodGetPayload(true) // 配置 GET 请求允许带 Body
|
client.SetAllowMethodGetPayload(true) // 配置 GET 请求允许带 Body
|
||||||
client.SetAllowMethodDeletePayload(true) // 配置 DELETE 请求允许带 Body
|
client.SetAllowMethodDeletePayload(true) // 配置 DELETE 请求允许带 Body
|
||||||
|
Loading…
x
Reference in New Issue
Block a user