5.7 KiB
5.7 KiB
优化后的批量修改说明 - 使用ctx参数
优化说明
根据建议,我们通过 ProcessRequests 方法传入 ctx context.Context 参数,而不是在每个方法内部创建 context.Background()。
这样的好处:
- 符合Go最佳实践:Context应该从上层传入
- 更好的控制:可以统一控制请求超时、取消等
- 代码更简洁:不需要在每个方法中重复创建context
- 更好的追踪:可以统一传递追踪信息
已完成的修改
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
这个脚本会:
- 备份
apirequestService.go文件 - 批量修改31个方法的签名
- 显示修改统计
方法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个方法都成功修改。如果没有修改成功,可能是因为:
- 某些方法已经修改过了
- 方法签名格式有差异
方法3:逐个手动修改
如果批量方法不适用,可以逐个修改。需要修改的方法列表:
已修改 ✅
- ProcessYYSYBE08Request
- ProcessFLXG0V4BRequest
待修改 ⏳
- ProcessPersonEnterpriseProRequest (第312行)
- ProcessFLXG0687Request (第671行)
- ProcessFLXG3D56Request (第699行)
- ProcessIVYZ5733Request (第754行)
- ProcessIVYZ9A2BRequest (第810行)
- ProcessJRZQ0A03Request (第922行)
- ProcessJRZQ8203Request (第979行)
- ProcessJRZQ4AA8Request (第1036行)
- ProcessQYGL8271Request (第1085行)
- ProcessQYGL6F2DRequest (第1150行)
- ProcessQCXG7A2BRequest (第1191行)
- ProcessYYSY09CDRequest (第1211行)
- ProcessBehaviorRiskScanRequest (第1247行)
- ProcessDWBG8B4DRequest (第1314行)
- ProcessDWBG6A2CRequest (第1339行)
- ProcessJRZQ4B6CRequest (第1363行)
- ProcessJRZQ09J8Request (第1387行)
- ProcessJRZQ5E9FRequest (第1411行)
- ProcessQYGL3F8ERequest (第1433行)
- ProcessIVYZ81NCRequest (第1461行)
- ProcessIVYZ7F3ARequest (第1482行)
- ProcessDWBG7F3ARequest (第1505行)
- ProcessJRZQ8A2DRequest (第1528行)
- ProcessYYSY8B1CRequest (第1550行)
- ProcessYYSY7D3ERequest (第1569行)
- ProcessFLXG7E8FRequest (第1590行)
- ProcessIVYZ8I9JRequest (第1613行)
- ProcessJRZQ7F1ARequest (第1636行)
- ProcessIVYZ3P9MRequest (第1659行)
- ProcessJRZQ6F2ARequest (第1680行)
每个方法需要做的修改:
修改前:
func (a *ApiRequestService) ProcessMethodName(params []byte) ([]byte, error) {
// 方法体
}
修改后:
func (a *ApiRequestService) ProcessMethodName(ctx context.Context, params []byte) ([]byte, error) {
// 方法体
}
注意事项
-
不需要在每个方法中添加
ctx := context.Background()- 因为现在通过参数传入
- 使用
ctx context.Context参数即可
-
callTianyuanApiWithLog方法已经支持传入 ctx- 如果第一个参数为空字符串
"",会自动从缓存获取featureID - 否则使用传入的featureID
- 如果第一个参数为空字符串
-
不需要修改方法内部的 API 调用
- 因为我们已经修改了部分方法使用
callTianyuanApiWithLog - 批量替换后,记得将所有
a.tianyuanapi.CallInterface替换为a.callTianyuanApiWithLog(ctx, "",
- 因为我们已经修改了部分方法使用
完成后验证
- 编译项目
cd ycc-proxy-server
go build ./...
-
检查编译错误
- 主要是方法签名不匹配的错误
- 如果有错误,检查哪些方法没有正确修改
-
运行测试
- 发起几个API请求
- 检查
tianyuanapi_call_log表 - 验证日志是否正确记录
优势总结
使用 ctx 参数的方式:
✅ 代码更简洁 - 不需要重复创建context ✅ 更好的控制 - 可以统一管理超时、取消 ✅ 符合最佳实践 - Context应该从上层传入 ✅ 便于追踪 - 可以在ctx中传递追踪信息 ✅ 便于测试 - 测试时可以传入自定义的ctx