优化更新
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
## 请求链路总览
|
||||
|
||||
:::tip 链路概览
|
||||
一个典型的 API 请求经过以下阶段:浏览器 → Nginx → CORS → 限流 → Redis 注入 → DB 会话 → 操作日志 → 路由匹配 → JWT 认证 → RBAC 鉴权 → WTForms 校验 → Router → Service → Repository → DB → 响应序列化 → 中间件反向链 → 浏览器
|
||||
一个典型的 API 请求经过以下阶段:浏览器 → Nginx → CORS → Redis 注入 → DB 会话 → 操作日志 → 路由匹配 → JWT 认证 → RBAC 鉴权 → WTForms 校验 → Router → Service → Repository → DB → 响应序列化 → 中间件反向链 → 浏览器
|
||||
:::
|
||||
|
||||
以下以 `POST /api/v1/position/add` 添加岗位为例,逐步拆解完整链路。
|
||||
@@ -49,37 +49,25 @@ Nginx 将请求代理到 Flask 服务,同时附加客户端真实 IP 到 `X-Fo
|
||||
|
||||
Flask 的中间件通过 `before_request` / `after_request` 钩子实现。请求从最外层进入,逐层穿透到路由处理函数,响应沿反向链返回。
|
||||
|
||||
### 3. CORS 跨域中间件(最外层)
|
||||
### 3. CORS 跨域配置(最外层)
|
||||
|
||||
```python
|
||||
# src/middleware/cors.py
|
||||
register_cors(app) # 注册 CORS 中间件
|
||||
# src/app.py - create_app()
|
||||
from flask_cors import CORS
|
||||
from config import CORS_ALLOWED_ORIGINS
|
||||
|
||||
if CORS_ALLOWED_ORIGINS:
|
||||
allowed_origins = [origin.strip() for origin in CORS_ALLOWED_ORIGINS.split(',') if origin.strip()]
|
||||
CORS(app, resources={r"/*": {"origins": allowed_origins}}, supports_credentials=True)
|
||||
else:
|
||||
CORS(app, resources={r"/*": {"origins": "*"}}, supports_credentials=False)
|
||||
```
|
||||
|
||||
- 检查 `Origin` 头是否在允许列表中
|
||||
- 预检请求(OPTIONS)直接返回 CORS 响应头
|
||||
- 普通请求附加 `Access-Control-Allow-*` 响应头
|
||||
|
||||
### 4. 请求限流中间件
|
||||
|
||||
```python
|
||||
# src/middleware/rate_limit.py
|
||||
@app.before_request
|
||||
def rate_limit():
|
||||
if not RATE_LIMIT_ENABLED:
|
||||
return
|
||||
# 滑动窗口计数器(Redis Lua 原子操作)
|
||||
count = sliding_window_incr(redis, current_key, prev_key, ...)
|
||||
if count > RATE_LIMIT_LIMIT:
|
||||
return R.failed("请求过于频繁,请稍后再试")
|
||||
```
|
||||
|
||||
- 基于客户端 IP 的滑动窗口计数器
|
||||
- 使用 Redis Lua 脚本保证原子性
|
||||
- 超限直接返回统一 JSON 响应,不进入后续链路
|
||||
- Redis 不可用时降级放行(fail-open)
|
||||
|
||||
### 5. Redis 上下文注入中间件
|
||||
### 4. Redis 上下文注入中间件
|
||||
|
||||
```python
|
||||
# src/core/redis_client.py
|
||||
@@ -351,8 +339,7 @@ R.ok(msg='添加成功')
|
||||
2. **操作日志**:记录写操作日志到数据库
|
||||
3. **DB 会话**:检测 `code==0`,执行 `db.session.commit()`
|
||||
4. **Redis 上下文**:无操作(g 对象自动清理)
|
||||
5. **限流**:无操作(响应直接透传)
|
||||
6. **CORS**:附加 `Access-Control-Allow-*` 响应头
|
||||
5. **CORS**:附加 `Access-Control-Allow-*` 响应头
|
||||
|
||||
### 20. 浏览器接收响应
|
||||
|
||||
@@ -381,10 +368,6 @@ R.ok(msg='添加成功')
|
||||
[CORS 中间件] ── 跨域校验通过
|
||||
│
|
||||
▼
|
||||
[限流中间件] ── 滑动窗口计数(Redis)
|
||||
│ ├─ 超限 → 直接返回失败
|
||||
│ └─ 通过 ▼
|
||||
▼
|
||||
[DB 会话中间件] ── 标记事务活跃
|
||||
│
|
||||
▼
|
||||
@@ -421,7 +404,7 @@ R.ok(msg='添加成功')
|
||||
└─ 业务失败(code≠0)→ rollback 回滚事务
|
||||
│
|
||||
▼
|
||||
[限流] → [CORS] → [Nginx]
|
||||
[CORS] → [Nginx]
|
||||
│
|
||||
▼
|
||||
[浏览器] ← JSON 响应({ code, data, msg, ok })
|
||||
@@ -443,4 +426,4 @@ R.ok(msg='添加成功')
|
||||
|
||||
## 总结
|
||||
|
||||
一个 API 请求从浏览器到数据库经过 7 个阶段、20+ 个处理节点。中间件链负责横切关注点(安全、限流、日志、事务),路由层负责认证鉴权,WTForms 负责参数校验,三层架构负责业务逻辑与数据访问。这种分层设计使得每一层职责单一、可独立测试,系统在高并发场景下仍能保持稳定的性能和可靠的事务一致性。
|
||||
一个 API 请求从浏览器到数据库经过 7 个阶段、20+ 个处理节点。中间件链负责横切关注点(安全、日志、事务),路由层负责认证鉴权,WTForms 负责参数校验,三层架构负责业务逻辑与数据访问。这种分层设计使得每一层职责单一、可独立测试,系统在高并发场景下仍能保持稳定的性能和可靠的事务一致性。
|
||||
|
||||
Reference in New Issue
Block a user