# 反向代理架构
**本文档引用的文件**
- [lib.rs](file://crates/pingora-proxy/src/lib.rs)
- [server.rs](file://crates/pingora-proxy/src/server.rs)
- [service.rs](file://crates/pingora-proxy/src/service.rs)
- [pingora_server.rs](file://crates/pingora-proxy/src/pingora_server.rs)
- [config.rs](file://crates/pingora-proxy/src/config.rs)
- [Cargo.toml](file://crates/pingora-proxy/Cargo.toml)
- [proxy_handler_api.rs](file://crates/rcoder/src/handler/proxy_handler_api.rs)
- [proxy_api.rs](file://crates/rcoder/src/handler/proxy_api.rs)
- [router.rs](file://crates/rcoder/src/router.rs)
- [README.md](file://README.md)
## 目录
1. [引言](#引言)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概述](#架构概述)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障恢复机制](#故障恢复机制)
9. [结论](#结论)
## 引言
本文档详细描述了基于Cloudflare Pingora构建的高性能反向代理架构。该架构设计用于在Docker容器环境中统一端口访问多个前端应用,通过端口参数实现灵活的请求路由。文档涵盖了端口路由机制、请求转发流程、状态监控和与主应用的集成模式,解释了选择Pingora而非Nginx的技术决策、性能优化策略和资源隔离方案。
## 项目结构
反向代理功能主要由`pingora-proxy` crate实现,该模块提供了完整的基于Pingora的高性能代理服务。主应用通过集成此模块,实现了对多个后端服务的统一访问和管理。
```mermaid
graph TD
subgraph "主应用"
A[rcoder]
B[agent_runner]
end
subgraph "反向代理模块"
C[pingora-proxy]
D[config]
E[service]
F[server]
G[pingora_server]
end
A --> C
B --> C
C --> D
C --> E
C --> F
C --> G
```
**图表来源**
- [lib.rs](file://crates/pingora-proxy/src/lib.rs)
- [Cargo.toml](file://crates/pingora-proxy/Cargo.toml)
**章节来源**
- [lib.rs](file://crates/pingora-proxy/src/lib.rs)
- [Cargo.toml](file://crates/pingora-proxy/Cargo.toml)
## 核心组件
反向代理的核心组件包括配置管理、服务实现、服务器管理和请求处理。`ProxyConfig`定义了代理服务的配置参数,`PingoraProxyService`实现了核心的代理逻辑,`ProxyServer`提供了服务器的启动和管理功能,而`PingoraServerManager`则负责完整的Pingora服务器生命周期管理。
**章节来源**
- [config.rs](file://crates/pingora-proxy/src/config.rs)
- [service.rs](file://crates/pingora-proxy/src/service.rs)
- [server.rs](file://crates/pingora-proxy/src/server.rs)
- [pingora_server.rs](file://crates/pingora-proxy/src/pingora_server.rs)
## 架构概述
基于Pingora的反向代理架构采用分层设计,从配置层到服务层再到服务器层,每一层都有明确的职责。该架构支持HTTP/1.1和HTTP/2,利用Pingora的异步I/O能力实现高性能请求处理。
```mermaid
graph TD
A[客户端请求] --> B[端口路由]
B --> C{路由规则}
C --> |/proxy/{port}| D[提取目标端口]
C --> |?port={port}| E[提取查询参数]
C --> |默认端口| F[使用默认端口]
D --> G[动态后端管理]
E --> G
F --> G
G --> H[健康检查]
H --> I[连接池管理]
I --> J[请求转发]
J --> K[后端服务]
K --> L[响应处理]
L --> M[客户端响应]
```
**图表来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs)
- [server.rs](file://crates/pingora-proxy/src/server.rs)
**章节来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs)
- [server.rs](file://crates/pingora-proxy/src/server.rs)
## 详细组件分析
### 端口路由机制
端口路由机制支持两种方式:路径方式(/proxy/{port}/{path})和查询参数方式(?port={port})。路径方式优先级高于查询参数方式,系统会首先尝试从路径中提取端口号,如果失败则尝试从查询参数中提取,最后使用默认端口。
```mermaid
flowchart TD
Start([开始]) --> CheckPath{"路径是否以
/proxy/开头?"}
CheckPath --> |是| ExtractPortFromPath["从路径提取端口
(parts[2].parse())"]
CheckPath --> |否| CheckQuery{"查询参数中
是否有port?"}
CheckQuery --> |是| ExtractPortFromQuery["从查询参数提取端口
(param.split_once('=')"]
CheckQuery --> |否| UseDefaultPort["使用默认端口
(3000)"]
ExtractPortFromPath --> ValidatePort{"端口有效?"}
ExtractPortFromQuery --> ValidatePort
ValidatePort --> |是| ReturnPort["返回提取的端口"]
ValidatePort --> |否| ReturnDefault["返回默认端口"]
ReturnPort --> End([结束])
ReturnDefault --> End
UseDefaultPort --> End
```
**图表来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs#L358-L375)
- [service.rs](file://crates/pingora-proxy/src/service.rs#L478-L507)
**章节来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs)
### 请求转发流程
请求转发流程由`PortProxy`实现,该组件实现了Pingora的`ProxyHttp` trait,负责处理请求的完整生命周期,包括请求头过滤、上游服务器选择和响应过滤。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Proxy as "反向代理"
participant Backend as "后端服务"
Client->>Proxy : HTTP请求
Proxy->>Proxy : 提取目标端口
Proxy->>Proxy : 动态添加后端(如需要)
Proxy->>Proxy : 重写Host头为127.0.0.1
Proxy->>Proxy : 添加代理头(X-Forwarded-Proto等)
Proxy->>Proxy : 重写请求路径
Proxy->>Backend : 转发请求
Backend-->>Proxy : 响应
Proxy->>Proxy : 记录指标(响应时间等)
Proxy->>Client : 返回响应
Note over Proxy,Backend : 基于Pingora的异步代理流程
```
**图表来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs#L247-L353)
- [service.rs](file://crates/pingora-proxy/src/service.rs#L357-L397)
**章节来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs)
### 状态监控与统计
反向代理提供了全面的状态监控和统计功能,包括请求计数、成功率、响应时间、活跃连接数等指标。这些指标通过`ProxyMetrics`结构体进行管理,并可通过API接口查询。
```mermaid
classDiagram
class ProxyMetrics {
+total_requests : AtomicU64
+total_responses : AtomicU64
+successful_responses : AtomicU64
+failed_responses : AtomicU64
+total_response_time_ns : AtomicU64
+active_connections : AtomicU64
+port_map : RwLock~HashMap>~
+record_request()
+record_response()
+avg_response_time_ms()
+port_snapshots()
}
class PerPortMetrics {
+requests : AtomicU64
+successes : AtomicU64
+failures : AtomicU64
+total_response_time_ns : AtomicU64
}
class PortSnapshot {
+port : u16
+requests : u64
+successes : u64
+failures : u64
+total_response_time_ns : u64
}
ProxyMetrics --> PerPortMetrics : "包含"
ProxyMetrics --> PortSnapshot : "生成"
```
**图表来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs#L26-L180)
- [service.rs](file://crates/pingora-proxy/src/service.rs#L598-L607)
**章节来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs)
### 与主应用的集成模式
反向代理通过`AppState`与主应用集成,主应用在启动时创建`PingoraProxyService`实例并将其注入应用状态,从而实现状态监控API与实际代理服务的数据共享。
```mermaid
classDiagram
class AppState {
+sessions : DashMap~String, Arc~
+project_and_agent_map : DashMap~String, Arc~
+config : AppConfig
+pingora_service : Option~Arc~
}
class PingoraProxyService {
+config : ProxyConfig
+backends : Arc~RwLock>~
+use_round_robin : bool
+metrics : Arc~ProxyMetrics~
+health_map : Arc~RwLock>~
+new(config)
+create_pingora_proxy()
+add_backend()
+remove_backend()
+list_backends()
+start_health_check_loop()
}
class AppConfig {
+proxy_config : Option~ProxyConfig~
+projects_dir : String
+agent : AgentConfig
}
AppState --> PingoraProxyService : "引用"
AppState --> AppConfig : "包含"
```
**图表来源**
- [router.rs](file://crates/rcoder/src/router.rs#L27-L35)
- [service.rs](file://crates/pingora-proxy/src/service.rs#L224-L233)
**章节来源**
- [router.rs](file://crates/rcoder/src/router.rs)
- [service.rs](file://crates/pingora-proxy/src/service.rs)
## 依赖分析
反向代理模块依赖于多个关键的Rust库,包括Pingora系列库用于高性能代理,Tokio用于异步运行时,Tracing用于日志记录,以及Axum用于HTTP服务构建。
```mermaid
graph TD
A[pingora-proxy] --> B[pingora]
A --> C[pingora-core]
A --> D[pingora-http]
A --> E[pingora-proxy]
A --> F[pingora-load-balancing]
A --> G[tokio]
A --> H[tracing]
A --> I[axum]
A --> J[reqwest]
A --> K[async-trait]
B --> L[Cloudflare Pingora]
C --> L
D --> L
E --> L
F --> L
G --> M[Tokio Runtime]
H --> N[Tracing Framework]
I --> O[Axum Web Framework]
J --> P[HTTP Client]
```
**图表来源**
- [Cargo.toml](file://crates/pingora-proxy/Cargo.toml)
- [lib.rs](file://crates/pingora-proxy/src/lib.rs)
**章节来源**
- [Cargo.toml](file://crates/pingora-proxy/Cargo.toml)
## 性能考虑
基于Pingora的反向代理在性能方面进行了多项优化,包括异步I/O处理、连接池管理、负载均衡和健康检查。与Nginx相比,Pingora作为Rust编写的库,提供了更好的内存安全性和性能表现。
```mermaid
flowchart TD
A[性能优化策略] --> B[异步I/O]
A --> C[连接池]
A --> D[负载均衡]
A --> E[健康检查]
A --> F[零拷贝]
A --> G[内存安全]
B --> H["基于Tokio的异步运行时
避免线程阻塞"]
C --> I["复用TCP连接
减少握手开销"]
D --> J["Round Robin/Ketama算法
均匀分发请求"]
E --> K["定期TCP健康检查
自动剔除故障节点"]
F --> L["避免数据复制
提高吞吐量"]
G --> M["Rust所有权模型
防止内存泄漏"]
style A fill:#f9f,stroke:#333,stroke-width:2px
```
**图表来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs)
- [server.rs](file://crates/pingora-proxy/src/server.rs)
**章节来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs)
- [server.rs](file://crates/pingora-proxy/src/server.rs)
## 故障恢复机制
反向代理实现了完善的故障恢复机制,包括健康检查、自动故障转移和连接重试。健康检查定期检测后端服务的可用性,并在服务恢复后自动重新加入负载均衡。
```mermaid
stateDiagram-v2
[*] --> Healthy
Healthy --> Unhealthy : "健康检查失败"
Unhealthy --> Healthy : "健康检查通过"
Unhealthy --> Timeout : "连接超时"
Timeout --> Unhealthy : "重试失败"
Timeout --> Healthy : "重试成功"
state Healthy {
[*] --> Active
Active --> Draining : "服务停止"
Draining --> [*]
}
state Unhealthy {
[*] --> Inactive
Inactive --> [*]
}
state Timeout {
[*] --> Retrying
Retrying --> Healthy : "成功"
Retrying --> Unhealthy : "失败"
}
note right of Healthy
健康状态:可正常处理请求
定期健康检查:每5秒一次
end note
note right of Unhealthy
不健康状态:从负载均衡中移除
不再接收新请求
end note
note right of Timeout
超时状态:连接失败
进行重试机制
end note
```
**图表来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs#L556-L591)
- [service.rs](file://crates/pingora-proxy/src/service.rs#L182-L197)
**章节来源**
- [service.rs](file://crates/pingora-proxy/src/service.rs)
## 结论
基于Pingora的反向代理架构提供了一个高性能、高可靠性的解决方案,特别适合在容器化环境中统一管理多个前端应用的访问。通过端口路由机制,实现了灵活的服务访问;通过健康检查和负载均衡,确保了服务的高可用性;通过详细的指标统计,提供了全面的监控能力。与主应用的紧密集成使得状态监控和配置管理更加便捷,整体架构设计合理,性能优越。