This commit is contained in:
Mrx
2026-03-21 18:36:42 +08:00
parent 06b5aa97ec
commit df6a51ae62
3 changed files with 95 additions and 6 deletions

View File

@@ -412,11 +412,8 @@ func NewContainer() *Container {
)
},
// AlicloudService - 阿里云服务
func(cfg *config.Config) *alicloud.AlicloudService {
return alicloud.NewAlicloudService(
cfg.Alicloud.Host,
cfg.Alicloud.AppCode,
)
func(cfg *config.Config) (*alicloud.AlicloudService, error) {
return alicloud.NewAlicloudServiceWithConfig(cfg)
},
sharedhttp.NewGinRouter,
ipgeo.NewLocator,

View File

@@ -0,0 +1,49 @@
package alicloud
import (
"tyapi-server/internal/config"
"tyapi-server/internal/shared/external_logger"
)
// NewAlicloudServiceWithConfig 使用配置创建阿里云服务,并启用外部服务调用日志
func NewAlicloudServiceWithConfig(cfg *config.Config) (*AlicloudService, error) {
loggingConfig := external_logger.ExternalServiceLoggingConfig{
Enabled: true,
LogDir: "./logs/external_services",
ServiceName: "alicloud",
UseDaily: false,
EnableLevelSeparation: true,
LevelConfigs: map[string]external_logger.ExternalServiceLevelFileConfig{
"info": {
MaxSize: 100,
MaxBackups: 3,
MaxAge: 28,
Compress: true,
},
"error": {
MaxSize: 100,
MaxBackups: 3,
MaxAge: 28,
Compress: true,
},
"warn": {
MaxSize: 100,
MaxBackups: 3,
MaxAge: 28,
Compress: true,
},
},
}
logger, err := external_logger.NewExternalServiceLogger(loggingConfig)
if err != nil {
return nil, err
}
return NewAlicloudService(
cfg.Alicloud.Host,
cfg.Alicloud.AppCode,
logger,
), nil
}

View File

@@ -1,6 +1,7 @@
package alicloud
import (
"crypto/md5"
"errors"
"fmt"
"io"
@@ -8,6 +9,8 @@ import (
"net/url"
"strings"
"time"
"tyapi-server/internal/shared/external_logger"
)
var (
@@ -24,25 +27,47 @@ type AlicloudConfig struct {
// AlicloudService 阿里云服务
type AlicloudService struct {
config AlicloudConfig
logger *external_logger.ExternalServiceLogger
}
// NewAlicloudService 创建阿里云服务实例
func NewAlicloudService(host, appCode string) *AlicloudService {
func NewAlicloudService(host, appCode string, logger ...*external_logger.ExternalServiceLogger) *AlicloudService {
var serviceLogger *external_logger.ExternalServiceLogger
if len(logger) > 0 {
serviceLogger = logger[0]
}
return &AlicloudService{
config: AlicloudConfig{
Host: host,
AppCode: appCode,
},
logger: serviceLogger,
}
}
// generateRequestID 生成请求ID
func (a *AlicloudService) generateRequestID() string {
timestamp := time.Now().UnixNano()
hash := md5.Sum([]byte(fmt.Sprintf("%d_%s", timestamp, a.config.Host)))
return fmt.Sprintf("alicloud_%x", hash[:8])
}
// CallAPI 调用阿里云API的通用方法
// path: API路径如 "api-mall/api/id_card/check"
// params: 请求参数
func (a *AlicloudService) CallAPI(path string, params map[string]interface{}) (respBytes []byte, err error) {
startTime := time.Now()
requestID := a.generateRequestID()
transactionID := ""
// 构建请求URL
reqURL := a.config.Host + "/" + path
// 记录请求日志
if a.logger != nil {
a.logger.LogRequest(requestID, transactionID, path, reqURL)
}
// 构建请求参数
formData := url.Values{}
for key, value := range params {
@@ -52,6 +77,9 @@ func (a *AlicloudService) CallAPI(path string, params map[string]interface{}) (r
// 创建HTTP请求
req, err := http.NewRequest("POST", reqURL, strings.NewReader(formData.Encode()))
if err != nil {
if a.logger != nil {
a.logger.LogError(requestID, transactionID, path, errors.Join(ErrSystem, err), params)
}
return nil, fmt.Errorf("%w: %s", ErrSystem, err.Error())
}
@@ -78,8 +106,14 @@ func (a *AlicloudService) CallAPI(path string, params map[string]interface{}) (r
}
if isTimeout {
if a.logger != nil {
a.logger.LogError(requestID, transactionID, path, errors.Join(ErrDatasource, fmt.Errorf("API请求超时: %s", err.Error())), params)
}
return nil, fmt.Errorf("%w: API请求超时: %s", ErrDatasource, err.Error())
}
if a.logger != nil {
a.logger.LogError(requestID, transactionID, path, errors.Join(ErrSystem, err), params)
}
return nil, fmt.Errorf("%w: %s", ErrSystem, err.Error())
}
defer resp.Body.Close()
@@ -87,9 +121,18 @@ func (a *AlicloudService) CallAPI(path string, params map[string]interface{}) (r
// 读取响应体
body, err := io.ReadAll(resp.Body)
if err != nil {
if a.logger != nil {
a.logger.LogError(requestID, transactionID, path, errors.Join(ErrSystem, err), params)
}
return nil, fmt.Errorf("%w: %s", ErrSystem, err.Error())
}
// 记录响应日志(不记录具体响应数据)
if a.logger != nil {
duration := time.Since(startTime)
a.logger.LogResponse(requestID, transactionID, path, resp.StatusCode, duration)
}
// 直接返回原始响应body让调用方自己处理
return body, nil
}