为什么选择 HTTP + WebSocket 混合架构
1. RESTful API 的优势
| 场景 | HTTP | WebSocket |
|---|---|---|
| 登录认证 | ✅ 标准流程,支持JWT/Cookie | ❌ 额外握手协议 |
| 分页查询 | ✅ 天然支持 skip/limit/page | ❌ 需要自定义协议 |
| 文件上传 | ✅ 成熟支持 | ❌ 复杂且不稳定 |
| 历史数据 | ✅ 直接查询,按需获取 | ❌ 需要缓存或重传 |
| 状态管理 | ✅ 无状态,易于扩展 | ❌ 有状态,需维护连接 |
关键代码:登录接口使用HTTP(
2. WebSocket 的优势
| 场景 | HTTP | WebSocket |
|---|---|---|
| 实时告警推送 | ❌ 轮询延迟高、浪费资源 | ✅ 秒级推送 |
| 指标实时更新 | ❌ 频繁请求,服务器压力大 | ✅ 按需推送 |
| 状态变化通知 | ❌ 无法主动通知 | ✅ 主动推送 |
关键代码:WebSocket服务(
3. 移动端的特殊性
┌─────────────────────────────────────────┐
│ 移动端问题 │
├───────────────────────────────────────── ┤
│ • APP进入后台 → WebSocket断开 │
│ • 网络切换(WiFi→4G) → 连接断开 │
│ • 系统休眠 → 心跳超时 │
│ • 电池优化 → 后台任务被杀死 │
│ • 内存限制 → 无法维持长时间连接 │
└─────────────────────────────────────────┘
4. 性能与资源权衡
全WebSocket方案的问题:
├── 服务器需要维护大量长连接 → 内存占用高
├── 移动端频繁重连 → 服务器压力大
├── 历史数据查询 → 需要自定义协议和缓存
├── 调试困难 → WebSocket帧不直观
混合方案的优势:
├── HTTP处理一次性请求 → 无状态,资源消耗低
├── WebSocket处理实时推送 → 有状态,但仅推送变化
├── 各司其职 → 架构清晰,易于维护
5. 当前设计的合理性
| 操作类型 | 使用协议 | 原因 |
|---|---|---|
| 登录、获取列表 | HTTP | 一次性请求,不需要实时 |
| 获取历史数据 | HTTP | 按需获取,分页查询 |
| 实时告警推送 | WebSocket | 需要秒级到达 |
| 指标更新推送 | WebSocket | 需要实时显示 |
| 文件下载 | HTTP | 成熟稳定 |
总结
不是不能全用WebSocket,而是没必要:
-
HTTP:适合请求-响应模式,处理登录、查询、上传下载
-
WebSocket:适合订阅-推送模式,处理实时告警和指标更新
这种混合架构是业界标准做法
HTTP + WebSocket 混合架构是现代 Web 应用中非常常见的组合方案,核心思路是:用 HTTP 处理请求-响应场景,用 WebSocket 处理实时双向通信场景。两者互补,各取所长。
为什么要混合使用
HTTP 的局限性
HTTP 是无状态、单向的协议,客户端发起请求,服务器返回响应,连接随即关闭。这导致它在以下场景力不从心:
- 实时推送:服务器无法主动通知客户端(如聊天消息、股票行情、游戏状态更新)。
- 高频通信:每次请求都要建立 TCP 连接、携带完整 Header,开销大。
- 长轮询替代方案:传统做法是用轮询(Polling)或长轮询(Long Polling)模拟实时,但效率低、延迟高、服务器压力大。
WebSocket 的优势
WebSocket 在客户端和服务器之间建立持久化的双向通道,连接建立后双方可以随时主动发送数据:
- 低延迟:无需重复握手,数据帧开销极小(最小 2 字节)。
- 双向通信:服务器可主动推送消息给客户端。
- 保持连接:一次握手,长期复用,适合高频交互。
混合架构的典型分工
| 场景 | 使用协议 | 原因 |
|---|---|---|
| 用户登录/注册 | HTTP | 标准请求-响应,无状态 |
| 获取数据列表 | HTTP | RESTful 风格,幂等安全 |
| 提交表单/上传文件 | HTTP | 一次性操作,适合 POST |
| 聊天消息收发 | WebSocket | 实时双向,低延迟 |
| 在线状态/通知推送 | WebSocket | 服务器主动推送 |
| 协同编辑/实时游戏 | WebSocket | 高频交互,毫秒级响应 |
| 心跳保活 | WebSocket | 长连接维持 |
实际工作流程
客户端 服务器
│ │
├──── HTTP 登录 ───────────────▶│ 认证、获取用户信息
│◀─── 返回 Token ─────────────── ┤
│ │
├──── WebSocket 握手 ─────────▶ │ 携带 Token 建立长连接
│◀─── 连接成功 ──────────────── ┤
│ │
├──── WebSocket 消息 ─────────▶ │ 实时通信开始
│◀─── WebSocket 推送 ────────── ┤
│ │
├──── HTTP 获取历史数据 ──────▶ │ 需要时仍用 HTTP 拉取
│◀─── 返回 JSON ─────────────── ┤
选择混合架构的核心原因
- 各司其职:HTTP 做 CRUD,WebSocket 做实时,职责清晰。
- 兼容性好:HTTP 部分可被 CDN、网关、负载均衡器无缝处理;WebSocket 部分专注实时通道。
- 降级方案:当 WebSocket 不可用时(如老旧浏览器、网络限制),可降级为 HTTP 长轮询,保证基本功能可用。
- 性能最优:避免用 HTTP 轮询模拟实时造成的大量无效请求,也避免用 WebSocket 传输静态资源造成连接浪费。
- 开发体验好:后端可用 Spring Boot 同时提供 REST API 和 WebSocket 端点,前端用 Axios + Socket.IO 即可覆盖全部场景。
常见技术栈组合
- Java:Spring Boot + Spring WebSocket / STOMP
- Node.js:Express + Socket.IO
- Python:FastAPI + WebSockets
- Go:Gin + Gorilla WebSocket

浙公网安备 33010602011771号