GIM 是一个使用 Go 语言开发的高性能即时通讯服务器,可作为业务系统的 IM 组件快速集成。
| 组件 | 技术 |
|---|---|
| 语言 | Go |
| 数据库 | MySQL |
| 缓存 | Redis |
| 通讯框架 | gRPC |
| 传输协议 | Protocol Buffers |
| ORM | GORM |
# 一键部署
./deploy_compose.sh
./deploy_k8s.sh
项目结构遵循 golang-standards/project-layout
gim/
├── cmd/ # 服务启动入口
├── config/ # 服务配置文件
├── deploy/ # 部署配置(Docker、K8s)
├── docs/ # 项目文档
├── internal/ # 私有代码(不对外暴露)
├── pkg/ # 公共代码(可被外部引用)
├── sql/ # 数据库脚本
├── test/ # 测试代码
└── web/ # Web IM 客户端(Vue 3 + Vite)
GIM 由三个核心服务组成:
长连接管理服务,负责: - 维持客户端 TCP/WebSocket 长连接 - 心跳检测与连接保活 - TCP 拆包粘包处理 - 消息编解码
业务逻辑服务,负责: - 设备信息管理 - 好友关系管理 - 群组信息管理 - 消息转发与路由
业务扩展服务,提供: - 用户注册登录 - 基础鉴权功能 - 可替换为自己的业务服务
如需接入自有业务系统,只需实现
user.int.proto中的UserIntService.Auth接口即可。
1. 登录获取凭证
└─► 调用 business.UserExtService.SignIn
└─► 获取 device_id, user_id, token
2. 建立长连接
└─► Web 端:WebSocket 连接
└─► APP 端:TCP 长连接
└─► 发送 SignInInput 完成长连接登录
3. 同步离线消息
└─► 调用 logic.MessageExtService.Sync
4. 收发消息
└─► 发送:调用 MessageIntService.PushToUsers
└─► 接收:通过长连接实时接收
每个用户维护一个自增序列号(seq),用于消息同步:
仓库内置一个Web IM 客户端,位于 web/ 目录,基于 Vue 3 + TypeScript + Vite + Naive UI,通过 gRPC-Web 与 WebSocket 与后端通信,使用 IndexedDB 做本地消息持久化。
提醒: web客户端全部使用AI开发,仅用作演示
cd web
npm install
npm run dev # 启动开发服务,默认 http://127.0.0.1:5173
更详细的功能说明与协议交互见 web.md。
主要 Proto 文件位于 pkg/protocol/proto/ 目录:
business/
├── user.ext.proto # 用户外部接口(登录注册等)
├── user.int.proto # 用户内部接口(鉴权)
├── friend.ext.proto # 好友接口
└── message.ext.proto # 消息接口
logic/
├── message.ext.proto # 消息外部接口
├── message.int.proto # 消息内部接口
├── device.int.proto # 设备接口
├── group.int.proto # 群组接口
└── room.int.proto # 房间接口
connect/
├── connect.ext.proto # 连接外部接口
└── connect.int.proto # 连接内部接口
本项目基于 MIT License 开源。