Files
ycc-proxy-server/deploy/sql/优化后的批量修改说明.md
2026-01-13 18:30:10 +08:00

5.7 KiB
Raw Blame History

优化后的批量修改说明 - 使用ctx参数

优化说明

根据建议,我们通过 ProcessRequests 方法传入 ctx context.Context 参数,而不是在每个方法内部创建 context.Background()

这样的好处:

  1. 符合Go最佳实践Context应该从上层传入
  2. 更好的控制:可以统一控制请求超时、取消等
  3. 代码更简洁不需要在每个方法中重复创建context
  4. 更好的追踪:可以统一传递追踪信息

已完成的修改

1. 修改了 ProcessRequests 方法签名

func (a *ApiRequestService) ProcessRequests(ctx context.Context, params []byte, productID string) ([]byte, error)
  • 移除了内部的 ctx, cancel = context.WithCancel(context.Background())
  • 直接使用外部传入的 ctx

2. 定义了 RequestProcessor 类型

type RequestProcessor func(ctx context.Context, a *ApiRequestService, params []byte) ([]byte, error)

3. 更新了 requestProcessors 映射

所有方法签名的类型都更新为接收 context.Context 参数

4. 修改了 PreprocessRequestApi 方法

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

5. 修改了示例方法

  • ProcessYYSYBE08Request - 已添加 ctx context.Context 参数
  • ProcessFLXG0V4BRequest - 已添加 ctx context.Context 参数

需要完成的修改

现在还需要修改剩余30个方法的签名在每个方法签名的 params 参数前添加 ctx context.Context 参数。

方法1使用批量修改脚本推荐

Linux/Mac 环境

cd ycc-proxy-server
chmod +x deploy/sql/批量修改方法签名.sh
./deploy/sql/批量修改方法签名.sh

这个脚本会:

  1. 备份 apirequestService.go 文件
  2. 批量修改31个方法的签名
  3. 显示修改统计

方法2使用IDE查找替换Windows环境推荐

步骤1在IDE中打开查找替换

打开 apirequestService.go,按 Ctrl+H 打开查找替换

步骤2查找并替换

查找内容:

func (a *ApiRequestService) Process(params []byte) ([]byte, error)

替换为:

func (a *ApiRequestService) Process(ctx context.Context, params []byte) ([]byte, error)

注意:

  • 这个模式会匹配所有 Process*Request 方法
  • 点击"全部替换"即可

步骤3验证替换

替换后检查是否所有31个方法都成功修改。如果没有修改成功可能是因为

  1. 某些方法已经修改过了
  2. 方法签名格式有差异

方法3逐个手动修改

如果批量方法不适用,可以逐个修改。需要修改的方法列表:

已修改

  1. ProcessYYSYBE08Request
  2. ProcessFLXG0V4BRequest

待修改

  1. ProcessPersonEnterpriseProRequest (第312行)
  2. ProcessFLXG0687Request (第671行)
  3. ProcessFLXG3D56Request (第699行)
  4. ProcessIVYZ5733Request (第754行)
  5. ProcessIVYZ9A2BRequest (第810行)
  6. ProcessJRZQ0A03Request (第922行)
  7. ProcessJRZQ8203Request (第979行)
  8. ProcessJRZQ4AA8Request (第1036行)
  9. ProcessQYGL8271Request (第1085行)
  10. ProcessQYGL6F2DRequest (第1150行)
  11. ProcessQCXG7A2BRequest (第1191行)
  12. ProcessYYSY09CDRequest (第1211行)
  13. ProcessBehaviorRiskScanRequest (第1247行)
  14. ProcessDWBG8B4DRequest (第1314行)
  15. ProcessDWBG6A2CRequest (第1339行)
  16. ProcessJRZQ4B6CRequest (第1363行)
  17. ProcessJRZQ09J8Request (第1387行)
  18. ProcessJRZQ5E9FRequest (第1411行)
  19. ProcessQYGL3F8ERequest (第1433行)
  20. ProcessIVYZ81NCRequest (第1461行)
  21. ProcessIVYZ7F3ARequest (第1482行)
  22. ProcessDWBG7F3ARequest (第1505行)
  23. ProcessJRZQ8A2DRequest (第1528行)
  24. ProcessYYSY8B1CRequest (第1550行)
  25. ProcessYYSY7D3ERequest (第1569行)
  26. ProcessFLXG7E8FRequest (第1590行)
  27. ProcessIVYZ8I9JRequest (第1613行)
  28. ProcessJRZQ7F1ARequest (第1636行)
  29. ProcessIVYZ3P9MRequest (第1659行)
  30. ProcessJRZQ6F2ARequest (第1680行)

每个方法需要做的修改:

修改前:

func (a *ApiRequestService) ProcessMethodName(params []byte) ([]byte, error) {
    // 方法体
}

修改后:

func (a *ApiRequestService) ProcessMethodName(ctx context.Context, params []byte) ([]byte, error) {
    // 方法体
}

注意事项

  1. 不需要在每个方法中添加 ctx := context.Background()

    • 因为现在通过参数传入
    • 使用 ctx context.Context 参数即可
  2. callTianyuanApiWithLog 方法已经支持传入 ctx

    • 如果第一个参数为空字符串 ""会自动从缓存获取featureID
    • 否则使用传入的featureID
  3. 不需要修改方法内部的 API 调用

    • 因为我们已经修改了部分方法使用 callTianyuanApiWithLog
    • 批量替换后,记得将所有 a.tianyuanapi.CallInterface 替换为 a.callTianyuanApiWithLog(ctx, "",

完成后验证

  1. 编译项目
cd ycc-proxy-server
go build ./...
  1. 检查编译错误

    • 主要是方法签名不匹配的错误
    • 如果有错误,检查哪些方法没有正确修改
  2. 运行测试

    • 发起几个API请求
    • 检查 tianyuanapi_call_log
    • 验证日志是否正确记录

优势总结

使用 ctx 参数的方式:

代码更简洁 - 不需要重复创建context 更好的控制 - 可以统一管理超时、取消 符合最佳实践 - Context应该从上层传入 便于追踪 - 可以在ctx中传递追踪信息 便于测试 - 测试时可以传入自定义的ctx