使用 UV 管理项目依赖和虚拟环境。
anp-proxy/
├── anp_proxy/ # 主代码包
│ ├── __init__.py
│ ├── gateway/ # Gateway 组件(公网侧)
│ ├── receiver/ # Receiver 组件(内网侧)
│ ├── protocol/ # ANPX 协议 SDK(可独立封装)
│ ├── common/ # 公共工具和配置
│ └── examples/ # 使用示例
├── tests/ # 测试代码
├── docs/ # 文档
├── pyproject.toml # UV 配置文件
└── README.md
├── anp_proxy.py # 主入口文件
职责:实现 ANPX 二进制协议的编解码逻辑,未来可单独封装为 SDK
protocol/
├── __init__.py
├── message.py # 消息结构定义(Header + TLV)
├── encoder.py # 消息编码器
├── decoder.py # 消息解码器
├── chunking.py # 分片处理逻辑
├── crc.py # CRC 校验工具
└── exceptions.py # 协议相关异常
核心功能:
- 24B 固定头部处理
- TLV 格式编解码
- 分片机制实现
- CRC 校验计算
- 消息完整性验证
职责:处理外部 HTTP 请求,通过 WSS 转发到内网
gateway/
├── __init__.py
├── server.py # HTTP 服务器(FastAPI/Starlette)
├── websocket_manager.py # WSS 连接管理
├── request_mapper.py # HTTP 请求映射和包装
├── response_handler.py # 响应处理和还原
└── middleware.py # 认证、限流等中间件
核心功能:
- 接收外部 HTTP 请求
- 将 HTTP 请求打包为 ANPX 协议
- 通过 WSS 发送给 Receiver
- 接收响应并还原为 HTTP 响应
- 连接管理和负载均衡
职责:维持 WSS 连接,调用本地应用
receiver/
├── __init__.py
├── client.py # WSS 客户端连接管理
├── app_adapter.py # 本地应用适配器(ASGI)
├── message_handler.py # 消息处理逻辑
└── reconnect.py # 断线重连机制
核心功能:
- 维持与 Gateway 的 WSS 长连接
- 解析 ANPX 协议消息
- 调用本地 ASGI 应用(使用
httpx.AsyncClient) - 将应用响应打包回传
- 自动重连和容错处理
职责:共享工具和配置
common/
├── __init__.py
├── config.py # 配置管理
├── auth.py # 双向认证
├── log_base.py # 日志配置
├── utils.py # 通用工具
└── constants.py # 常量定义
HTTP Request → Gateway → Protocol Encoder → WSS → Protocol Decoder → Receiver → Local App
Local App → Receiver → Protocol Encoder → WSS → Protocol Decoder → Gateway → HTTP Response
| 组件 | 技术选择 | 理由 |
|---|---|---|
| HTTP 服务 | FastAPI + Uvicorn | 高性能异步、自动文档 |
| WSS 客户端/服务端 | websockets |
纯异步、支持 TLS |
| 序列化 | pydantic |
类型安全、易扩展 |
| 本地调用 | httpx.AsyncClient |
零拷贝 ASGI 调用 |
| 日志 | structlog |
结构化日志、调试友好 |
| 配置管理 | pydantic-settings |
环境变量 + 配置文件 |
from anp_proxy.gateway import GatewayServer
server = GatewayServer(config)
server.run()from anp_proxy.receiver import ReceiverClient
client = ReceiverClient(config, local_app)
client.connect_and_serve()from anp_proxy import ANPProxy
proxy = ANPProxy(config)
proxy.run_both() # 同时启动 Gateway 和 Receiver- Protocol 层完全独立,可作为 SDK 单独发布
- Gateway/Receiver 依赖 Protocol,但相互独立
- Common 层提供基础设施,被其他层使用
- 全异步 I/O 设计(asyncio)
- 使用 asyncio.Queue 处理消息队列
- asyncio.Semaphore 实现流控
- TLV 格式支持协议扩展
- 插件化的中间件系统
- 多种本地应用适配器
- CRC 校验保证数据完整性
- 自动重连机制
- 优雅降级和错误处理
✅ 框架无关:Protocol 层完全独立,Gateway/Receiver 可适配任意框架
✅ 全量转发:完整封装 HTTP 五元组,支持分片传输
✅ 安全可靠:WSS + 双向认证 + CRC 校验 + 断线重连
✅ 高性能异步:纯异步架构,单连接多并发,无磁盘落地