Files
ycc-proxy-server/deploy/sql/Context参数优化说明.md
2026-01-13 18:30:10 +08:00

4.5 KiB
Raw Blame History

Context参数优化说明

优化内容

ctx context.ContextProcessRequests 方法作为参数传入,而不是在每个 ProcessXXXRequest 方法内部创建。

优化原因

  1. 更好的上下文管理:可以从上层传递 context支持超时、取消等操作
  2. 避免重复代码:不需要在每个方法里都写 ctx := context.Background()
  3. 更好的可追踪性:可以通过 context 传递请求ID、用户ID等元数据
  4. 符合Go最佳实践context 应该作为第一个参数传递

修改内容

1. ProcessRequests 方法签名修改

修改前:

func (a *ApiRequestService) ProcessRequests(params []byte, productID string) ([]byte, error) {
	var ctx, cancel = context.WithCancel(context.Background())
	defer cancel()

修改后:

func (a *ApiRequestService) ProcessRequests(ctx context.Context, params []byte, productID string) ([]byte, error) {
	var cancel context.CancelFunc
	ctx, cancel = context.WithCancel(ctx)
	defer cancel()

2. PreprocessRequestApi 方法修改

修改前:

func (a *ApiRequestService) PreprocessRequestApi(params []byte, apiID string) ([]byte, error) {
	if processor, exists := requestProcessors[apiID]; exists {
		return processor(a, params)
	}
	return nil, errors.New("api请求, 未找到相应的处理程序")
}

修改后:

func (a *ApiRequestService) PreprocessRequestApi(ctx context.Context, params []byte, apiID string) ([]byte, error) {
	if processor, exists := requestProcessors[apiID]; exists {
		return processor(a, ctx, params)
	}
	return nil, errors.New("api请求, 未找到相应的处理程序")
}

3. requestProcessors map 类型定义修改

修改前:

var requestProcessors = map[string]func(*ApiRequestService, []byte) ([]byte, error){

修改后:

var requestProcessors = map[string]func(*ApiRequestService, context.Context, []byte) ([]byte, error){

4. 所有 ProcessXXXRequest 方法签名修改

修改前:

func (a *ApiRequestService) ProcessYYSYBE08Request(params []byte) ([]byte, error) {
	ctx := context.Background()
	// ...
}

修改后:

func (a *ApiRequestService) ProcessYYSYBE08Request(ctx context.Context, params []byte) ([]byte, error) {
	// 移除了 ctx := context.Background()
	// ...
}

5. 错误码提取优化

修改前:

if tianyuanErr, ok := err.(*tianyuanapi.Error); ok {
	errorCode = fmt.Sprintf("%d", tianyuanErr.Code)
}

修改后:

if code := tianyuanapi.GetCodeByError(err); code != -1 {
	errorCode = fmt.Sprintf("%d", code)
}

修改的方法列表32个

所有以下方法都已添加 ctx context.Context 作为第一个参数,并移除了内部的 ctx := context.Background() 声明:

  1. ProcessPersonEnterpriseProRequest
  2. ProcessBehaviorRiskScanRequest
  3. ProcessYYSYBE08Request
  4. ProcessYYSY09CDRequest
  5. ProcessFLXG0687Request
  6. ProcessFLXG3D56Request
  7. ProcessFLXG0V4BRequest
  8. ProcessQYGL8271Request
  9. ProcessIVYZ5733Request
  10. ProcessIVYZ9A2BRequest
  11. ProcessJRZQ0A03Request
  12. ProcessQYGL6F2DRequest
  13. ProcessJRZQ8203Request
  14. ProcessJRZQ4AA8Request
  15. ProcessQCXG7A2BRequest
  16. ProcessDWBG8B4DRequest
  17. ProcessDWBG6A2CRequest
  18. ProcessJRZQ4B6CRequest
  19. ProcessJRZQ09J8Request
  20. ProcessJRZQ5E9FRequest
  21. ProcessQYGL3F8ERequest
  22. ProcessIVYZ81NCRequest
  23. ProcessIVYZ7F3ARequest
  24. ProcessDWBG7F3ARequest
  25. ProcessJRZQ8A2DRequest
  26. ProcessYYSY8B1CRequest
  27. ProcessYYSY7D3ERequest
  28. ProcessFLXG7E8FRequest
  29. ProcessIVYZ8I9JRequest
  30. ProcessJRZQ7F1ARequest
  31. ProcessIVYZ3P9MRequest
  32. ProcessJRZQ6F2ARequest

调用方验证

调用方 paySuccessNotify.go 已经正确传递了 ctx

combinedResponse, err := l.svcCtx.ApiRequestService.ProcessRequests(ctx, decryptData, product.Id)

优势

  1. 统一的上下文管理所有API调用共享同一个 context可以统一控制超时和取消
  2. 更好的错误追踪:可以在 context 中传递请求ID、用户ID等信息方便日志追踪
  3. 代码更简洁:不需要在每个方法中重复创建 context
  4. 符合Go规范context 作为第一个参数是 Go 的标准做法

注意事项

  • 所有方法现在都依赖外部传入的 ctx,不再内部创建
  • ProcessRequests 方法内部仍然会创建一个带 cancel 的 context用于控制并发请求的取消
  • 如果将来需要在 context 中传递元数据如请求ID、用户ID可以在调用 ProcessRequests 之前设置