f
This commit is contained in:
158
deploy/sql/Context参数优化说明.md
Normal file
158
deploy/sql/Context参数优化说明.md
Normal file
@@ -0,0 +1,158 @@
|
||||
# Context参数优化说明
|
||||
|
||||
## 优化内容
|
||||
|
||||
将 `ctx context.Context` 从 `ProcessRequests` 方法作为参数传入,而不是在每个 `ProcessXXXRequest` 方法内部创建。
|
||||
|
||||
## 优化原因
|
||||
|
||||
1. **更好的上下文管理**:可以从上层传递 context,支持超时、取消等操作
|
||||
2. **避免重复代码**:不需要在每个方法里都写 `ctx := context.Background()`
|
||||
3. **更好的可追踪性**:可以通过 context 传递请求ID、用户ID等元数据
|
||||
4. **符合Go最佳实践**:context 应该作为第一个参数传递
|
||||
|
||||
## 修改内容
|
||||
|
||||
### 1. ProcessRequests 方法签名修改
|
||||
|
||||
**修改前:**
|
||||
```go
|
||||
func (a *ApiRequestService) ProcessRequests(params []byte, productID string) ([]byte, error) {
|
||||
var ctx, cancel = context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
```
|
||||
|
||||
**修改后:**
|
||||
```go
|
||||
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 方法修改
|
||||
|
||||
**修改前:**
|
||||
```go
|
||||
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请求, 未找到相应的处理程序")
|
||||
}
|
||||
```
|
||||
|
||||
**修改后:**
|
||||
```go
|
||||
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 类型定义修改
|
||||
|
||||
**修改前:**
|
||||
```go
|
||||
var requestProcessors = map[string]func(*ApiRequestService, []byte) ([]byte, error){
|
||||
```
|
||||
|
||||
**修改后:**
|
||||
```go
|
||||
var requestProcessors = map[string]func(*ApiRequestService, context.Context, []byte) ([]byte, error){
|
||||
```
|
||||
|
||||
### 4. 所有 ProcessXXXRequest 方法签名修改
|
||||
|
||||
**修改前:**
|
||||
```go
|
||||
func (a *ApiRequestService) ProcessYYSYBE08Request(params []byte) ([]byte, error) {
|
||||
ctx := context.Background()
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**修改后:**
|
||||
```go
|
||||
func (a *ApiRequestService) ProcessYYSYBE08Request(ctx context.Context, params []byte) ([]byte, error) {
|
||||
// 移除了 ctx := context.Background()
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 错误码提取优化
|
||||
|
||||
**修改前:**
|
||||
```go
|
||||
if tianyuanErr, ok := err.(*tianyuanapi.Error); ok {
|
||||
errorCode = fmt.Sprintf("%d", tianyuanErr.Code)
|
||||
}
|
||||
```
|
||||
|
||||
**修改后:**
|
||||
```go
|
||||
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`:
|
||||
|
||||
```go
|
||||
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` 之前设置
|
||||
|
||||
Reference in New Issue
Block a user