From 94cbccc047038d5f9aad5935bf134dc6b468d444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 28 Mar 2025 18:13:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=86=E7=BB=84=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E8=AF=B7=E6=B1=82=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- httpclient/mesh/define.go | 20 ++++++++++---------- httpclient/mesh/mesh.go | 17 +++++++++++++++-- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/httpclient/mesh/define.go b/httpclient/mesh/define.go index d51c228..a273e76 100644 --- a/httpclient/mesh/define.go +++ b/httpclient/mesh/define.go @@ -85,16 +85,16 @@ type RequestConfigResultRule struct { // // Date : 14:40 2025/3/28 type Response struct { - FinalFailure bool `json:"final_failure"` // 是否最终失败 - FailureApiAlias string `json:"failure_api_alias"` // 导致最终失败的接口别名 - IsSuccess bool `json:"is_success"` // 请求是否成功 - ErrorCode string `json:"error_code"` // 错误码 - ErrorMessage string `json:"error_message"` // 错误信息 - FailApiAlias []string `json:"fail_api_alias"` // 失败的接口别名 - Raw []byte `json:"raw"` // 返回结果的raw数据(按照result_rule格式化后的结果) - DataMap map[string]any `json:"data_map"` // 返回结果的map格式(按照result_rule格式化后的结果) - AliasResultTable map[string]*Response `json:"alias_result_table"` // 每一个请求的返回结果 key: 请求别名 value: 请求返回数据 - Lock *sync.RWMutex `json:"-"` // 数据锁, public, 外部拿到结果需要做一席并发读写操作, 可以直接复用这把锁 + FinalFailure bool `json:"final_failure"` // 是否最终失败 + FailureApiAlias string `json:"failure_api_alias"` // 导致最终失败的接口别名 + IsSuccess bool `json:"is_success"` // 请求是否成功 + ErrorCode string `json:"error_code"` // 错误码 + ErrorMessage string `json:"error_message"` // 错误信息 + FailApiAlias []string `json:"fail_api_alias"` // 失败的接口别名 + Raw []byte `json:"raw"` // 返回结果的raw数据(按照result_rule格式化后的结果) + DataMap map[string]any `json:"data_map"` // 返回结果的map格式(按照result_rule格式化后的结果) + AliasResultTable map[string]*define.Response `json:"alias_result_table"` // 每一个请求的返回结果 key: 请求别名 value: 请求返回数据 + Lock *sync.RWMutex `json:"-"` // 数据锁, public, 外部拿到结果需要做一席并发读写操作, 可以直接复用这把锁 } const ( diff --git a/httpclient/mesh/mesh.go b/httpclient/mesh/mesh.go index 41d6566..8a38406 100644 --- a/httpclient/mesh/mesh.go +++ b/httpclient/mesh/mesh.go @@ -10,6 +10,7 @@ package mesh import ( "context" "git.zhangdeman.cn/zhangdeman/network/httpclient" + "git.zhangdeman.cn/zhangdeman/network/httpclient/define" "sync" ) @@ -24,7 +25,7 @@ func Request(req *RequestConfig, receiver any) *Response { ErrorMessage: "", Raw: nil, DataMap: nil, - AliasResultTable: make(map[string]*Response), + AliasResultTable: make(map[string]*define.Response), Lock: &sync.RWMutex{}, }, reqCfg: req, @@ -67,6 +68,7 @@ func (c *client) doRequest(apiList []*RequestConfigGroupItem) bool { ) // 初始化一下请求 c.initApiCfg(apiCfg) + // TODO: 构造生成请求参数 if httpClient, err = httpclient.NewHttpClient(apiCfg.RequestCfg, apiCfg.CacheInstance); nil != err { // 此处获取客户端实例即发生异常, 忽略一切配置, 直接作为全局失败, 后续也不请求了 c.resp.ErrorCode = "-500" @@ -86,12 +88,23 @@ func (c *client) doRequest(apiList []*RequestConfigGroupItem) bool { } wg.Done() }() - // TODO : 判断是否已经是最终失败 + if c.resp.FinalFailure && !apiCfg.FinalFailureAllow { + // 已经最终失败, 并且最终失败后, 当前接口已经不允许请求, 不在进行请求 + return + } resp := httpClientList[clientIdx].Request() c.resp.Lock.Lock() defer c.resp.Lock.Unlock() if !resp.IsSuccess { + // 判断是否已经是最终失败 + if apiCfg.FailBehavior.FinalFailure || apiCfg.FailBehavior.Action == FailBehaviorError { + c.resp.FinalFailure = true + // 判断是否继续, 只能阻断后续分组请求,无法阻断当前租的请求 + isContinue = FailBehaviorContinue == apiCfg.FailBehavior.Action + } } + // 记录请求的信息 + c.resp.AliasResultTable[apiCfg.Alias] = resp }(idx, apiCfg) } wg.Wait()