外观
整体架构
业务账号由你的系统管理,通信状态由 IM 服务与 SDK 管理。接入时先划清这两个边界,避免把服务端密钥带入客户端,或为同一账号创建两套消息状态。
服务与数据路径
text
客户 App / Web / 桌面端
├─ 业务登录 ───────────────→ 客户业务后端
│ ├─ 签名 Server API → IM Server
│ └─ 接收 Webhook ←── IM Server
├─ SDK:IM Session / REST / WebSocket ───────────→ IM Server
│ ├─ 数据库与缓存
│ └─ 附件授权与对象存储
└─ Call SDK:授权后的音视频连接 ────────────────→ 媒体服务UIKit 位于客户端展示层,消费 SDK 的数据和操作接口。客户业务后端不需要转发每一条聊天消息;客户端获得有效 IM Session 后直接连接 IM 数据面。
服务端采用 Java 21 / Spring Boot 3,实时连接基于 Netty / WebSocket,数据使用 MySQL 与 Redis,并对接 S3 兼容对象存储和音视频媒体服务。分层职责与业务接口见服务端技术栈与接口概览。
一次登录如何完成
- 用户通过客户应用完成业务登录。
- 客户后端校验业务身份与权限,并调用 IM 的服务端接口取得绑定用户和设备的 IM Session。
- 客户应用将 Session 交给 SDK,连接配置的 REST/WebSocket 地址。
- SDK同步会话与消息,向界面发布当前快照和后续变化。
- Session 需要更新时,由宿主续签回调向业务后端重新申请;退出时结束当前通信状态。
业务 Token 与 IM Session 用途不同。控制面签名密钥只保存在服务端;客户端只接收自己需要的短效登录结果。详见业务账号与 IM Session。
谁管理哪些状态
| 状态 | 负责方 |
|---|---|
| 业务登录、账号生命周期与业务权限 | 客户业务系统 |
| 消息顺序、群权限与服务端可访问范围 | IM Server |
| 发送状态、缓存、分页与断线补拉 | IM SDK |
| 选中项、临时草稿投影、页面交互 | UIKit 或客户 UI |
| 通话邀请、忙线与通话状态 | Call SDK 与配套服务端授权 |
| 已入房参与者与音视频媒体 | 音视频媒体服务及对应适配 |
原生移动端与 Electron 使用 C++/SQLite 路径;Flutter 默认使用 Dart 运行时和本地 SQLite;Web 使用浏览器存储;微信使用受平台预算约束的缓存。存储方式不同,不改变“SDK 管理通信状态,UI 订阅结果”的接入原则。
私有化网络设计
客户端可以来自内网或公网。根据目标用户决定域名、反向代理、证书、WebSocket 入口、对象存储访问与媒体网络策略;需要音视频时,还应验证实际网络中的媒体连通性。
生产部署建议使用正常校验证书的 HTTPS/WSS。浏览器的安全上下文与跨域、微信合法域名、移动端系统权限,仍需按各平台要求配置。
附件与业务事件
附件上传结果需要形成标准消息内容;读取时可能使用有时效的授权地址,地址失效与消息不存在是两种情况。参见附件接入。
Webhook 将选定事件通知客户后端。接收方需要校验签名并处理重复事件,不能将业务后端的处理完成与用户界面的已读状态混为一谈。参见Webhook。
下一步:接入准备 · Server API 认证 · 私有化部署