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;
}