缓存实例挂载到reqConfig上, 无需单独传入

This commit is contained in:
白茶清欢 2025-05-07 11:17:15 +08:00
parent 1ca3c2d094
commit f1a65c1ed8
2 changed files with 19 additions and 21 deletions

View File

@ -14,7 +14,6 @@ import (
"time" "time"
"git.zhangdeman.cn/zhangdeman/consts" "git.zhangdeman.cn/zhangdeman/consts"
"git.zhangdeman.cn/zhangdeman/network/httpclient/cache"
"git.zhangdeman.cn/zhangdeman/network/httpclient/define" "git.zhangdeman.cn/zhangdeman/network/httpclient/define"
"git.zhangdeman.cn/zhangdeman/network/httpclient/log" "git.zhangdeman.cn/zhangdeman/network/httpclient/log"
"git.zhangdeman.cn/zhangdeman/network/httpclient/validate" "git.zhangdeman.cn/zhangdeman/network/httpclient/validate"
@ -28,7 +27,7 @@ import (
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 15:27 2024/5/31 // Date : 15:27 2024/5/31
func NewHttpClient(reqConfig *define.Request, cacheInstance cache.ICache) (*HttpClient, error) { func NewHttpClient(reqConfig *define.Request) (*HttpClient, error) {
if nil == reqConfig.Logger { if nil == reqConfig.Logger {
reqConfig.Logger = log.Get() // 未单独指定日志实例, 则使用全局日志实例 reqConfig.Logger = log.Get() // 未单独指定日志实例, 则使用全局日志实例
} }
@ -101,7 +100,6 @@ func NewHttpClient(reqConfig *define.Request, cacheInstance cache.ICache) (*Http
http5xxHandler: make([]define.Http5xxHandler, 0), http5xxHandler: make([]define.Http5xxHandler, 0),
httpBusinessErrorHandler: make([]define.HttpBusinessErrorHandler, 0), httpBusinessErrorHandler: make([]define.HttpBusinessErrorHandler, 0),
requestFinishHandler: make([]define.RequestFinishHandler, 0), requestFinishHandler: make([]define.RequestFinishHandler, 0),
cacheInstance: cacheInstance,
} }
hc.OnRequestFinish(func(req *define.Request, rep *define.Response) { hc.OnRequestFinish(func(req *define.Request, rep *define.Response) {
if rep.IsSuccess { if rep.IsSuccess {
@ -129,7 +127,6 @@ type HttpClient struct {
httpBusinessErrorHandler []define.HttpBusinessErrorHandler httpBusinessErrorHandler []define.HttpBusinessErrorHandler
requestSendErrorHandler []define.RequestSendErrorHandler requestSendErrorHandler []define.RequestSendErrorHandler
requestFinishHandler []define.RequestFinishHandler requestFinishHandler []define.RequestFinishHandler
cacheInstance cache.ICache
} }
// OnResponse4xx 4xx处理逻辑 // OnResponse4xx 4xx处理逻辑
@ -219,14 +216,13 @@ func (hc *HttpClient) Request() *define.Response {
) )
if cacheResult = hc.getCacheResult(); nil == cacheResult { if cacheResult = hc.getCacheResult(); nil == cacheResult {
// 未命中缓存, 直接请求后端接口, 无需 // 未命中缓存, 直接请求后端接口, 无需检测预热等逻辑
return hc.requestBackendApi() return hc.requestBackendApi()
} }
// 上面若命中缓存, 则后续缓存实例不可能为nil, 无需判断
// TODO : 预热加锁, 并发请求触发预热, 仅触发一个即可 // TODO : 预热加锁, 并发请求触发预热, 仅触发一个即可
// 判断是否开启预热 // 判断是否开启预热
inputCachePreHeatConfig := hc.cacheInstance.PreHeatConfig() cachePreHeatConfig := hc.reqConfig.CacheInstance.PreHeatConfig()
var cachePreHeatConfig define.CachePreHeatConfig
serialize.JSON.TransitionIgnoreError(inputCachePreHeatConfig, &cachePreHeatConfig)
log.RecordDebug("接口请求命中缓存", map[string]any{ log.RecordDebug("接口请求命中缓存", map[string]any{
"cache_info": cacheResult.CacheInfo, "cache_info": cacheResult.CacheInfo,
}, hc.reqConfig) }, hc.reqConfig)
@ -250,7 +246,7 @@ func (hc *HttpClient) Request() *define.Response {
} }
// 将百分比的配置归一化成最小剩余时间的配置 // 将百分比的配置归一化成最小剩余时间的配置
if cachePreHeatConfig.MinPercent > 0 { if cachePreHeatConfig.MinPercent > 0 {
expectMinTTL := hc.cacheInstance.CacheTime() * cachePreHeatConfig.MinPercent / 100 expectMinTTL := hc.reqConfig.CacheInstance.CacheTime() * cachePreHeatConfig.MinPercent / 100
log.RecordDebug("接口请求命中缓存, 配置预热策略:有效时长剩余百分比", map[string]any{ log.RecordDebug("接口请求命中缓存, 配置预热策略:有效时长剩余百分比", map[string]any{
"cache_pre_heat_config": cachePreHeatConfig, "cache_pre_heat_config": cachePreHeatConfig,
"percent_min_ttl": expectMinTTL, "percent_min_ttl": expectMinTTL,
@ -267,7 +263,7 @@ func (hc *HttpClient) Request() *define.Response {
}, hc.reqConfig) }, hc.reqConfig)
return return
} }
ttl := hc.cacheInstance.TTL(cacheResult.CacheInfo.CacheKey) ttl := hc.reqConfig.CacheInstance.TTL(cacheResult.CacheInfo.CacheKey)
if ttl < 0 { if ttl < 0 {
// 不存在或者未设置有效期 // 不存在或者未设置有效期
log.RecordDebug("接口请求命中缓存, 当前缓存结果不存在或未设置有效期, 不执行预热", map[string]any{ log.RecordDebug("接口请求命中缓存, 当前缓存结果不存在或未设置有效期, 不执行预热", map[string]any{
@ -480,7 +476,7 @@ func (hc *HttpClient) newResponse() *define.Response {
SetCache: false, SetCache: false,
CacheKey: "", CacheKey: "",
CacheValue: "", CacheValue: "",
CacheEnable: nil != hc.cacheInstance && hc.cacheInstance.Enable(), CacheEnable: nil != hc.reqConfig.CacheInstance && hc.reqConfig.CacheInstance.Enable(),
CacheError: nil, CacheError: nil,
}, },
RequestCount: 0, RequestCount: 0,
@ -581,17 +577,17 @@ func (hc *HttpClient) isCodeSuccess(response *define.Response) bool {
// //
// Date : 16:04 2024/6/3 // Date : 16:04 2024/6/3
func (hc *HttpClient) getCacheResult() *define.Response { func (hc *HttpClient) getCacheResult() *define.Response {
if nil == hc.cacheInstance { if nil == hc.reqConfig.CacheInstance {
log.RecordDebug("接口请求前缓存检测, 未设置缓存实例", map[string]any{}, hc.reqConfig) log.RecordDebug("接口请求前缓存检测, 未设置缓存实例", map[string]any{}, hc.reqConfig)
return nil return nil
} }
if !hc.cacheInstance.Enable() { if !hc.reqConfig.CacheInstance.Enable() {
log.RecordDebug("接口请求前缓存检测, 设置缓存实例, 但未启用缓存功能", map[string]any{}, hc.reqConfig) log.RecordDebug("接口请求前缓存检测, 设置缓存实例, 但未启用缓存功能", map[string]any{}, hc.reqConfig)
return nil return nil
} }
startTime := time.Now().UnixMilli() startTime := time.Now().UnixMilli()
cacheKey := hc.cacheInstance.GetKey(hc.reqConfig) cacheKey := hc.reqConfig.CacheInstance.GetKey(hc.reqConfig)
cacheValue := strings.TrimSpace(hc.cacheInstance.GetValue(cacheKey)) cacheValue := strings.TrimSpace(hc.reqConfig.CacheInstance.GetValue(cacheKey))
if len(cacheValue) == 0 { if len(cacheValue) == 0 {
log.RecordDebug("接口请求前缓存检测, 未读取到缓存数据", map[string]any{}, hc.reqConfig) log.RecordDebug("接口请求前缓存检测, 未读取到缓存数据", map[string]any{}, hc.reqConfig)
return nil return nil
@ -619,16 +615,16 @@ func (hc *HttpClient) getCacheResult() *define.Response {
// //
// Date : 16:24 2024/6/3 // Date : 16:24 2024/6/3
func (hc *HttpClient) setCacheResult(response *define.Response) (bool, error) { func (hc *HttpClient) setCacheResult(response *define.Response) (bool, error) {
if nil == response || nil == hc.cacheInstance { if nil == response || nil == hc.reqConfig.CacheInstance {
log.RecordDebug("接口请求成功后, 缓存设置失败", map[string]any{ log.RecordDebug("接口请求成功后, 缓存设置失败", map[string]any{
"response_is_nil": response == nil, "response_is_nil": response == nil,
"cache_instance_is_nil": hc.cacheInstance == nil, "cache_instance_is_nil": hc.reqConfig.CacheInstance == nil,
}, hc.reqConfig) }, hc.reqConfig)
return false, nil return false, nil
} }
// 全局未开启或者当前请求不支持缓存 // 全局未开启或者当前请求不支持缓存
globalCacheEnable := hc.cacheInstance.Enable() globalCacheEnable := hc.reqConfig.CacheInstance.Enable()
currentRequestAllowCache := hc.cacheInstance.IsAllow(hc.reqConfig, response) currentRequestAllowCache := hc.reqConfig.CacheInstance.IsAllow(hc.reqConfig, response)
log.RecordDebug("检测缓存是否允许执行", map[string]any{ log.RecordDebug("检测缓存是否允许执行", map[string]any{
"current_cache_enable": currentRequestAllowCache, "current_cache_enable": currentRequestAllowCache,
"global_cache_enable": globalCacheEnable, "global_cache_enable": globalCacheEnable,
@ -636,9 +632,9 @@ func (hc *HttpClient) setCacheResult(response *define.Response) (bool, error) {
if !globalCacheEnable || !currentRequestAllowCache { if !globalCacheEnable || !currentRequestAllowCache {
return false, nil return false, nil
} }
cacheKey := hc.cacheInstance.GetKey(hc.reqConfig) cacheKey := hc.reqConfig.CacheInstance.GetKey(hc.reqConfig)
cacheValue := serialize.JSON.MarshalForStringIgnoreError(response) cacheValue := serialize.JSON.MarshalForStringIgnoreError(response)
if err := hc.cacheInstance.SetValue(cacheKey, cacheValue); nil != err { if err := hc.reqConfig.CacheInstance.SetValue(cacheKey, cacheValue); nil != err {
log.RecordWarn("开启结果缓存, 缓存设置失败", map[string]any{ log.RecordWarn("开启结果缓存, 缓存设置失败", map[string]any{
"current_cache_enable": currentRequestAllowCache, "current_cache_enable": currentRequestAllowCache,
"global_cache_enable": globalCacheEnable, "global_cache_enable": globalCacheEnable,

View File

@ -9,6 +9,7 @@ package define
import ( import (
"context" "context"
"git.zhangdeman.cn/zhangdeman/network/httpclient/cache"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
"go.uber.org/zap" "go.uber.org/zap"
) )
@ -40,6 +41,7 @@ type Request struct {
RetryRule *RequestRetryRule `json:"retry_rule"` // 重试规则 RetryRule *RequestRetryRule `json:"retry_rule"` // 重试规则
Logger *zap.Logger `json:"-"` // 日志记录器 Logger *zap.Logger `json:"-"` // 日志记录器
RateLimiter resty.RateLimiter `json:"-"` // 流控实例 RateLimiter resty.RateLimiter `json:"-"` // 流控实例
CacheInstance cache.ICache `json:"-"` // 数据结果缓存实例
} }
// RequestRetryRule 重试规则 // RequestRetryRule 重试规则