184 lines
5.7 KiB
Markdown
184 lines
5.7 KiB
Markdown
|
|
# 优化后的批量修改说明 - 使用ctx参数
|
|||
|
|
|
|||
|
|
## 优化说明
|
|||
|
|
|
|||
|
|
根据建议,我们通过 `ProcessRequests` 方法传入 `ctx context.Context` 参数,而不是在每个方法内部创建 `context.Background()`。
|
|||
|
|
|
|||
|
|
这样的好处:
|
|||
|
|
1. **符合Go最佳实践**:Context应该从上层传入
|
|||
|
|
2. **更好的控制**:可以统一控制请求超时、取消等
|
|||
|
|
3. **代码更简洁**:不需要在每个方法中重复创建context
|
|||
|
|
4. **更好的追踪**:可以统一传递追踪信息
|
|||
|
|
|
|||
|
|
## 已完成的修改
|
|||
|
|
|
|||
|
|
### 1. 修改了 ProcessRequests 方法签名
|
|||
|
|
```go
|
|||
|
|
func (a *ApiRequestService) ProcessRequests(ctx context.Context, params []byte, productID string) ([]byte, error)
|
|||
|
|
```
|
|||
|
|
- 移除了内部的 `ctx, cancel = context.WithCancel(context.Background())`
|
|||
|
|
- 直接使用外部传入的 `ctx`
|
|||
|
|
|
|||
|
|
### 2. 定义了 RequestProcessor 类型
|
|||
|
|
```go
|
|||
|
|
type RequestProcessor func(ctx context.Context, a *ApiRequestService, params []byte) ([]byte, error)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 更新了 requestProcessors 映射
|
|||
|
|
所有方法签名的类型都更新为接收 `context.Context` 参数
|
|||
|
|
|
|||
|
|
### 4. 修改了 PreprocessRequestApi 方法
|
|||
|
|
```go
|
|||
|
|
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 环境
|
|||
|
|
```bash
|
|||
|
|
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:查找并替换
|
|||
|
|
**查找内容:**
|
|||
|
|
```text
|
|||
|
|
func (a *ApiRequestService) Process(params []byte) ([]byte, error)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**替换为:**
|
|||
|
|
```text
|
|||
|
|
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行)
|
|||
|
|
|
|||
|
|
每个方法需要做的修改:
|
|||
|
|
|
|||
|
|
**修改前:**
|
|||
|
|
```go
|
|||
|
|
func (a *ApiRequestService) ProcessMethodName(params []byte) ([]byte, error) {
|
|||
|
|
// 方法体
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改后:**
|
|||
|
|
```go
|
|||
|
|
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. **编译项目**
|
|||
|
|
```bash
|
|||
|
|
cd ycc-proxy-server
|
|||
|
|
go build ./...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **检查编译错误**
|
|||
|
|
- 主要是方法签名不匹配的错误
|
|||
|
|
- 如果有错误,检查哪些方法没有正确修改
|
|||
|
|
|
|||
|
|
3. **运行测试**
|
|||
|
|
- 发起几个API请求
|
|||
|
|
- 检查 `tianyuanapi_call_log` 表
|
|||
|
|
- 验证日志是否正确记录
|
|||
|
|
|
|||
|
|
## 优势总结
|
|||
|
|
|
|||
|
|
使用 `ctx` 参数的方式:
|
|||
|
|
|
|||
|
|
✅ **代码更简洁** - 不需要重复创建context
|
|||
|
|
✅ **更好的控制** - 可以统一管理超时、取消
|
|||
|
|
✅ **符合最佳实践** - Context应该从上层传入
|
|||
|
|
✅ **便于追踪** - 可以在ctx中传递追踪信息
|
|||
|
|
✅ **便于测试** - 测试时可以传入自定义的ctx
|
|||
|
|
|