WebSocket
XYGo Admin 2025-02-20 55 次阅读
即时聊天模块的架构与开发指南
WebSocket
架构设计
项目基于 gorilla/websocket 实现即时通讯,采用 Hub 模式管理连接:
WebSocket 基础设施(internal/websocket/)
├── init.go # Start() 启动 Hub、WsHandler 处理连接
├── client.go # 客户端连接封装
├── manager.go # Hub 管理器(SendToUser/IsUserOnline)
├── router.go # 消息路由分发
└── model.go # WsResponse 等数据结构
连接流程
前端 WebSocket 连接
→ /socket/ 端点
→ WsAuth 中间件(JWT 鉴权)
→ WsHandler 创建 Client
→ 注册到 Hub Manager
→ 开始收发消息
聊天功能
聊天业务逻辑在 internal/logic/chat/chat.go 中实现:
| 功能 | 方法 | 说明 |
|---|---|---|
| 会话列表 | Sessions | 获取单聊/群聊会话列表 |
| 创建会话 | CreateSession | 单聊去重 + 群聊系统消息 |
| 删除会话 | DeleteSession | 软删除(仅对当前用户) |
| 消息列表 | Messages | 游标分页 + 发送者信息 |
| 发送消息 | SendMessage | 写入 DB + 更新未读 + WS 推送 |
| 标记已读 | MarkRead | 标记已读 + 推送已读回执 |
| 联系人 | Contacts | 含部门/岗位/在线状态 |
| 群聊管理 | GroupUpdate | 改名/加人/踢人 |
| 未读总数 | UnreadTotal | 所有会话未读消息总数 |
前端 WebSocket 客户端
位于 web/src/utils/socket/index.ts,特性:
- 单例模式:全局只维护一个连接
- 心跳检测:定时发送 ping 保持连接
- 指数退避重连:断线后自动重连,间隔递增
- 消息队列:连接断开时缓存消息,恢复后自动发送
- 连接超时:超时自动断开并重试
typescript
import { useWebSocket } from '@/utils/socket'
const ws = useWebSocket()
ws.connect()
ws.send({ type: 'chat', data: { ... } })
ws.onMessage((msg) => { ... })
Nginx 配置
WebSocket 需要特殊的 Nginx 配置:
nginx
location /socket/ {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}