# im_server **Repository Path**: QiuTF/im_server ## Basic Information - **Project Name**: im_server - **Description**: IM后端服务,使用Golang开发 - **Primary Language**: Go - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-05-02 - **Last Updated**: 2026-04-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IM Server - 即时通讯服务器 基于 Go + Gin + WebSocket + RabbitMQ 实现的轻量级即时通讯服务器。 ## 技术栈 - **Web 框架**: Gin - **数据库**: MySQL + GORM - **缓存**: Redis - **消息队列**: RabbitMQ - **实时通信**: WebSocket (gorilla/websocket) - **认证**: JWT (dgrijalva/jwt-go) - **配置管理**: Viper ## 功能特性 - 用户注册/登录 (JWT 认证) - 实时消息推送 (WebSocket) - 消息持久化存储 - 基于 RabbitMQ 的消息队列 - 用户头像上传 - 用户列表与详情查询 - 历史消息查询 - CORS 跨域支持 ## 项目结构 ``` im_server/ ├── app/ │ ├── controllers/ # 控制器层 │ │ ├── LoginController.go │ │ ├── UserController.go │ │ └── MsgController.go │ ├── middleware/ # 中间件 │ │ ├── JWTMiddleware.go │ │ ├── CorsMiddleware.go │ │ └── LogMiddleware.go │ ├── model/ # 数据模型 │ │ ├── User.go │ │ └── Msg.go │ ├── services/ # 业务逻辑层 │ │ ├── JwtService.go │ │ └── MsgQueueService.go │ └── response/ # 统一响应格式 │ └── response.go ├── bootstrap/ # 启动初始化 │ ├── config.go │ ├── db.go │ ├── redis.go │ ├── rabbitmq.go │ ├── ws.go │ ├── router.go │ └── log.go ├── config/ # 配置结构体 │ ├── app.go │ ├── database.go │ ├── redis.go │ └── rabbitmq.go ├── routes/ # 路由定义 │ └── api.go ├── global/ # 全局变量 │ └── app.go ├── utils/ # 工具函数 │ └── utils.go ├── storage/ # 文件存储 │ ├── logs/ │ └── upload/ ├── config.yaml # 配置文件 ├── db.sql # 数据库脚本 ├── Dockerfile ├── docker-compose.yml └── main.go ``` ## 数据库设计 ### 用户表 (im_user) | 字段 | 类型 | 说明 | |------|------|------| | id | INT | 主键 | | name | VARCHAR(64) | 用户名 | | password | VARCHAR(256) | 密码 (MD5) | | status | INT | 用户状态 | | avatar | VARCHAR(128) | 头像 URL | | introduction | VARCHAR(512) | 个人简介 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | ### 消息表 (im_msg) | 字段 | 类型 | 说明 | |------|------|------| | id | INT | 主键 | | send_uid | INT | 发送者 ID | | receive_uid | INT | 接收者 ID | | msg_type | INT | 消息类型 | | msg_content | VARCHAR(256) | 消息内容 | | send_time | DATETIME | 发送时间 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | ## 快速开始 ### 环境要求 - Go 1.25+ - MySQL 5.7+ - Redis 6.0+ - RabbitMQ 3.8+ ### 安装步骤 1. **克隆项目** ```bash git clone cd im_server ``` 2. **安装依赖** ```bash go mod download ``` 3. **配置数据库** ```bash mysql -u root -p < db.sql ``` 4. **修改配置文件** 编辑 `config.yaml`: ```yaml app: env: local app_url: local.chat port: 9508 database: driver: mysql host: 127.0.0.1 port: 3306 database: im_chat username: root password: your_password charset: utf8mb4 redis: host: 127.0.0.1 password: port: 6379 db: 10 rabbitmq: host: 127.0.0.1 port: 5672 username: admin password: 123456 ``` 5. **运行服务** ```bash go run main.go ``` 服务将在 `http://localhost:9508` 启动 ### Docker 部署 ```bash docker-compose up -d ``` ## API 接口 ### 公开接口 | 方法 | 路径 | 说明 | |------|------|------| | POST | /api/login | 用户登录 | | POST | /api/register | 用户注册 | ### 需要认证的接口 **用户相关** (需要 JWT Token) | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/user/list | 获取用户列表 | | GET | /api/user/detail | 获取用户详情 | | POST | /api/user/send-msg | 发送消息 | | POST | /api/user/upload-avatar | 上传头像 | **消息相关** (需要 JWT Token) | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/msg/list | 获取消息列表 | ### WebSocket 连接 ``` ws://localhost:9508/ws?uid={用户ID} ``` ## 核心流程 ### 消息发送流程 1. 客户端通过 HTTP POST `/api/user/send-msg` 发送消息 2. 服务器将消息存入 MySQL 数据库 3. 消息异步发送到 RabbitMQ 队列 4. 接收方的 WebSocket 连接订阅对应队列 5. 消息通过 WebSocket 实时推送给接收方 ### WebSocket 连接管理 - 每个用户建立 WebSocket 连接时,服务器维护 `uid -> conn` 的映射 - 同一用户重复连接会关闭旧连接 - 每个连接独立协程处理,订阅自己的 RabbitMQ 队列 - 连接断开时自动清理资源 ### 认证机制 - 使用 JWT 进行用户认证 - Token 在登录时生成,包含用户 ID 和用户名 - 受保护的路由通过 `JWTMiddleware` 验证 Token - Token 解析后的用户信息存储在 `gin.Context.Keys` 中 ## 配置说明 ### 应用配置 - `env`: 运行环境 (local/production) - `app_url`: 应用域名 - `port`: 服务端口 ### 数据库配置 - 支持 MySQL - 使用 GORM 作为 ORM - 自动处理连接池 ### Redis 配置 - 用于缓存和消息队列 - 可配置数据库编号 ### RabbitMQ 配置 - 消息队列服务 - 每个用户独立队列 - 支持消息持久化 ## 开发说明 ### 添加新接口 1. 在 `app/controllers/` 创建控制器 2. 在 `routes/api.go` 注册路由 3. 如需认证,添加 `middleware.JWTAuth()` 中间件 ### 添加新模型 1. 在 `app/model/` 定义结构体 2. 使用 GORM 标签定义字段映射 3. 在数据库中创建对应表 ### 日志管理 - 访问日志存储在 `storage/logs/access.log` - 使用 `LogMiddleware` 记录请求信息 ## 注意事项 - 密码使用 MD5 加密存储 (建议生产环境使用 bcrypt) - WebSocket 允许所有来源连接 (生产环境需限制) - 文件上传存储在本地 `storage/upload/` (建议使用对象存储) - JWT 未设置过期时间 (建议添加 Token 刷新机制) ## License MIT