sequenceDiagram
participant R as Request
participant M1 as FirstMiddleware
participant M2 as SecondMiddleware
participant H as Handler
participant Res as Response
R->>M1: 1. 请求进入
M1->>M1: 2. First - Before
M1->>M2: 3. c.Next()
M2->>M2: 4. Second - Before
M2->>H: 5. c.Next()
H->>H: 6. Handler 处理
H-->>M2: 7. 返回结果
M2->>M2: 8. Second - After
M2-->>M1: 9. 返回
M1->>M1: 10. First - After
M1-->>Res: 11. 最终响应
// 中间件执行顺序示例
func FirstMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("First - Before")
c.Next()
fmt.Println("First - After")
}
}
func SecondMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("Second - Before")
c.Next()
fmt.Println("Second - After")
}
}
func Handler(c *gin.Context) {
fmt.Println("Handler")
c.JSON(200, gin.H{"message": "success"})
}
// 使用示例
r.GET("/test", FirstMiddleware(), SecondMiddleware(), Handler)
// 执行顺序:
// First - Before
// Second - Before
// Handler
// Second - After
// First - After
flowchart TD
A[请求进入中间件] --> B{验证条件}
B -->|通过| C[c.Set设置上下文]
C --> D[c.Next继续执行]
D --> E[后续中间件/处理器]
B -->|失败| F[c.JSON返回错误]
F --> G[c.Abort中断执行]
G --> H[直接返回响应]
style F fill:#ffcdd2
style G fill:#ffcdd2
style H fill:#ffcdd2
style C fill:#c8e6c9
style D fill:#c8e6c9
style E fill:#c8e6c9
flowchart TD
A[请求到达] --> B{检查缓存键}
B -->|存在| C[从缓存获取数据]
B -->|不存在| D[执行业务逻辑]
C --> E[返回缓存数据]
D --> F[处理请求]
F --> G[存储到缓存]
G --> H[返回响应]
E --> I[请求完成]
H --> I
style A fill:#e1f5fe
style C fill:#c8e6c9
style G fill:#fff3e0
style I fill:#f3e5f5
flowchart TD
A[请求处理] --> B{发生错误?}
B -->|否| C[正常响应]
B -->|是| D[捕获错误]
D --> E{错误类型判断}
E -->|业务错误| F[返回业务错误响应]
E -->|系统错误| G[记录错误日志]
E -->|未知错误| H[返回通用错误响应]
F --> I[响应完成]
G --> J[返回系统错误响应]
H --> I
J --> I
C --> I
style A fill:#e1f5fe
style D fill:#ffecb3
style G fill:#ffcdd2
style I fill:#f3e5f5
flowchart TD
A[配置文件] --> B[配置解析器]
B --> C[中间件工厂]
C --> D[中间件实例]
D --> E[路由注册]
E --> F[运行时监控]
F --> G{需要更新?}
G -->|是| H[热重载]
G -->|否| F
H --> C
style A fill:#e1f5fe
style C fill:#fff3e0
style F fill:#e8f5e8
style H fill:#ffecb3
flowchart TD
A[请求进入] --> B{检查内存使用}
B -->|正常| C[执行中间件]
B -->|过高| D[触发GC]
C --> E[处理完成]
D --> F[等待GC完成]
F --> C
E --> G[释放资源]
G --> H[更新内存统计]
style B fill:#fff3e0
style D fill:#ffecb3
style G fill:#e8f5e8
sequenceDiagram
participant T as Test
participant G as Gin Engine
participant M as Middleware
participant H as Handler
T->>G: 构造请求/上下文
G->>M: 执行中间件链
M-->>H: 传递上下文/标记
H-->>T: 响应
T->>T: 断言日志/状态码/头/副作用