【免费下载链接】open-im-server
IM Chat OpenClaw
OpenIM 是一个以"嵌入应用"为设计目标的开源即时通讯(IM)服务化平台,它将聊天、音视频通话、消息推送与 AI 聊天机器人能力封装为一套可复用的 API 与 Webhooks,供业务应用按需集成。本文以仓库内项目总览文档(docs/readme/README_uk.md)为核心骨架,结合本仓库真实源码与配置,系统梳理 OpenIM 的产品定位、OpenIMSDK 客户端能力、OpenIMServer 微服务端架构、REST API 与 Webhooks 扩展机制,并给出源码、Docker 与 Kubernetes 三种部署路径的实操指引。读完本文,你将掌握 OpenIM 端到端的工作方式,并能在本仓库中快速定位关键模块、配置与部署文件。
项目定位:IM 能力平台,而非独立聊天应用
OpenIM 与 Telegram、Signal、Rocket.Chat 这类"开箱即用的独立聊天软件"有本质区别:OpenIM 不为最终用户提供一款可直接安装的聊天 App,而是为开发者提供一套可嵌入自有应用的 IM 基础设施。
它的核心分工是"两件套":
- OpenIMSDK:运行在客户端应用内部,负责连接管理、消息收发与本地数据组织;
- OpenIMServer:服务端平台,负责账号、好友、群组、消息路由、推送等业务能力,并以 API / Webhooks 形式开放给业务系统。
业务开发者只需把 SDK 嵌入自己的 App,把业务服务器与 OpenIMServer 对接,即可获得完整的通信能力,而无需从零构建消息链路。原文档用一张关系图说明了 AppServer、AppClient、OpenIMServer、OpenIMSDK 四者之间的交互方式:
OpenIMSDK:客户端侧的 IM 能力包
OpenIMSDK 是专为 OpenIMServer 设计的客户端 IM SDK,面向 iOS、Android、Windows、macOS 与 Web 等终端嵌入使用。原文档将其能力归纳为四大特性与五大模块。
四大核心特性
- 本地存储(Local Storage):在客户端本地持久化消息与会话数据,支持离线浏览历史记录,减少对服务端的频繁拉取;
- 监听回调(Listener Callbacks):以回调机制向业务层推送新消息、连接状态变化等事件,业务方只需注册监听器即可实时响应;
- API 封装(API Wrapping):将底层长连接与协议细节封装为简洁的面向业务的方法调用;
- 连接管理(Connection Management):负责长连接的建立、心跳、断线重连与多端在线策略,保证弱网与切换网络场景下的消息可达性。
五大核心模块
- 初始化与登录:完成 SDK 配置初始化、Token 登录与登录态维护;
- 用户管理:用户资料查询、更新与在线状态感知;
- 好友管理:好友申请、关系维护与黑名单管理;
- 群组功能:建群、加群、群资料与群成员管理;
- 会话处理:单聊/群聊会话的创建、消息收发与未读数管理。
SDK 采用 Golang 构建并面向多平台交付,目的是让各端获得一致的集成体验。SDK 本体单独维护于 openim-sdk-core 仓库,本仓库(open-im-server)则通过 SDK 与 Server 的协议约定协同工作。
OpenIMServer:微服务架构的服务端平台
OpenIMServer 是本仓库的主体,采用微服务架构设计,原生支持集群模式,整体由网关(Gateway)与多个 RPC 服务构成。
服务组成与源码印证
从单体入口 cmd/main.go 的注册代码可以清晰地看到平台包含的服务集合:
putCmd(cmd, false, auth.Start) // RPC:鉴权
putCmd(cmd, false, conversation.Start) // RPC:会话
putCmd(cmd, false, relation.Start) // RPC:好友/黑名单关系
putCmd(cmd, false, group.Start) // RPC:群组
putCmd(cmd, false, msg.Start) // RPC:消息
putCmd(cmd, false, third.Start) // RPC:第三方对象存储
putCmd(cmd, false, user.Start) // RPC:用户
putCmd(cmd, false, push.Start) // 推送服务
putCmd(cmd, true, msggateway.Start) // 消息网关(长连接)
putCmd(cmd, true, msgtransfer.Start) // 消息转移(Kafka→MongoDB)
putCmd(cmd, true, api.Start) // REST API 网关
putCmd(cmd, true, cron.Start) // 定时任务
各服务的实现分散在 internal/rpc(auth、conversation、relation、group、msg、third、user 等子目录)、internal/msggateway、internal/msgtransfer、internal/push、internal/api 与 internal/tools/cron 中。putCmd 的第二个参数表示该服务是否为阻塞型(常驻)服务,RPC 服务与网关、API、消息转移、定时任务协同构成完整闭环。
长连接消息链路
消息网关(msggateway)负责维护客户端长连接,是消息实时下发的咽喉;消息转移(msgtransfer)则负责消费消息队列(默认 Kafka)中的消息并写入 MongoDB 持久化。对应配置见 config/openim-msggateway.yml 与 config/openim-msgtransfer.yml。这一"网关实时推送 + 转移落库"的分工,使 OpenIM 得以支撑大规模并发在线场景。
海量用户承载能力
原文档给出三个关键量级:十万级成员的超大群、千万级注册用户、百亿级消息。从架构上看,支撑这些量级的关键设计包括:网关水平扩展(多实例注册于服务发现中心)、消息经 Kafka 削峰解耦、MongoDB 承载海量消息存储、Redis 承担缓存与在线状态管理。
增强业务能力:REST API 与 Webhooks
OpenIMServer 为业务系统提供了两类"对外接口",让业务形态可以无限扩展。
REST API:面向业务系统的服务端接口
业务后端可以通过 REST API 直接驱动平台能力,例如通过后端接口创建群组、向用户推送消息等。API 层由 openim-api 服务承载,入口配置见 config/openim-api.yml:
api:
listenIP: 0.0.0.0
ports: [ 10002 ]
compressionLevel: 0
listenIP:监听地址,0.0.0.0表示同时监听内网与外网地址(推荐默认值);ports:监听端口列表,配置多个端口会启动多个实例,数量须与prometheus.ports保持一致;compressionLevel:API 压缩级别,0默认压缩、1最佳压缩、2最快速度、-1不压缩。
API 层的路由与处理器集中在 internal/api(auth、user、friend、group、msg、conversation、third 等),网关鉴权逻辑见 internal/api/auth.go。API 的 Prometheus 监控也在同一份配置中开启(prometheus.enable: true,autoSetPorts: true 自动分配端口)。
Webhooks:事件驱动的业务回调
Webhooks 是 OpenIMServer 的回调扩展机制:在某个事件发生之前或之后,OpenIMServer 会向业务服务器发起 HTTP 请求,例如消息发送前/后的回调,业务方可以在回调中做内容审核、敏感词过滤、自定义处理等。回调消息的结构体定义在 pkg/callbackstruct(message、friend、group、user、push、msg_gateway 等),回调触发逻辑可参考 internal/msg/send.go 与 internal/group/callback.go。回调的完整配置见 config/webhooks.yml。
整体架构:分层视图
原文档用一张架构分层图帮助读者快速建立全局认知,图中可以直观看到从客户端接入层(网关)到 RPC 业务层、再到消息队列与存储层的完整分层:
对应的分层落地可以一一在仓库中找到:接入层对应 internal/msggateway 与 internal/api,业务层对应 internal/rpc 下的各服务,消息中间件与存储配置则位于 config 目录(kafka、mongodb、redis、minio 等 yml)。
快速开始:四种部署路径
OpenIM 提供多种部署方式,开发者可按环境选择。原文档给出的路径在仓库中均有对应落地文件:
| 部署方式 | 仓库内入口 | 适用场景 |
|---|---|---|
| 源码部署 | docs/contrib/install-openim-linux-system.md | 二次开发、深入调试 |
| Docker 部署 | docker-compose.yml | 快速体验、中小规模 |
| Kubernetes 部署 | deployments/Readme.md | 生产集群、弹性伸缩 |
| Mac 开发部署 | docs/contrib/mac-developer-deployment-guide.md | 本地开发环境 |
源码部署
源码方式依赖 Go 工具链与构建工具 Mage。仓库提供了环境引导脚本 bootstrap.sh:脚本会自动把 mage 安装到 $HOME/.local/bin(若该目录已在 PATH 中)或 /usr/local/bin,然后执行 go mod download 拉取依赖。各服务均有独立入口,位于 cmd 目录(如 openim-api、openim-rpc-msg、openim-msggateway 等),同时 cmd/main.go 提供了一个"一键启动全部服务"的独立部署入口(使用 -c 指定配置目录、-i 指定启动序号)。
Docker 部署
仓库根目录的 docker-compose.yml 是 Docker 部署的核心,其中已编排好平台依赖的完整中间件与可选监控组件:
- MongoDB(
37017:27017):主存储,启动时自动创建openim_v3数据库与openIM业务账号; - Redis(
16379:6379):缓存与在线状态,默认密码openIM123,开启 AOF 持久化; - etcd(
12379:2379、12380:2380):服务发现与配置中心,支持可选开启认证; - Kafka(
19094:9094):消息队列,采用 KRaft 模式(无需 ZooKeeper),外部地址为localhost:19094; - MinIO(
10005:9000、19090:9090):对象存储,用于图片、文件等富媒体消息; - openim-web-front(
11001:80):Web 端演示前端(admin-front 已注释,可按需启用); - Prometheus / Alertmanager / Grafana / node-exporter:监控告警组件,挂载
profiles: m,仅在显式指定 profile 时启动,配置挂载自 config/prometheus.yml 等文件。
中间件的镜像名通过 ${MONGO_IMAGE}、${REDIS_IMAGE} 等环境变量注入,数据目录由 ${DATA_DIR} 控制,便于定制化部署。
Kubernetes 部署
Kubernetes 部署的完整流程见 deployments/Readme.md,核心步骤为:
- 前置条件:预先部署好 Redis、MongoDB、Kafka、MinIO;
- 进入 deployments/deploy 目录;
- 修改 deployments/deploy/openim-config.yml 中的 ConfigMap,将
discovery.yml的kubernetes.namespace、mongodb.yml/kafka.yml/redis.yml的address、minio.yml的internalAddress与externalAddress指向你集群内的实际服务; - 将 Redis、Mongo、MinIO、Kafka 的密码以 base64 写入对应的
*-secret.yml,执行kubectl apply -f redis-secret.yml -f minio-secret.yml -f mongo-secret.yml -f kafka-secret.yml; - 依次应用
openim-config.yml、clusterRole.yml(默认命名空间需要)以及各服务的*-deployment.yml/*-service.yml; - 用
kubectl get pods / svc / deployments / all验证状态,kubectl delete -f ./一键清理。
注意:若使用自定义命名空间,所有 kubectl 命令需追加 -n <namespace> 参数。
配置体系:一份 share 配置看懂全局
平台配置集中在 config 目录,采用"一服务一 yml"的约定(如 openim-api.yml、openim-rpc-msg.yml、openim-msggateway.yml),另有全局共享配置 config/share.yml,其中几个关键项值得说明:
secret: openIM123 # 服务间通信共享密钥
imAdminUser:
userIDs: [imAdmin] # 管理员用户 ID 列表
nicknames: [superAdmin] # 与 userIDs 按下标一一对应的昵称
queue: kafka # 消息队列引擎:kafka(默认)/redis/memory(仅独立部署)
multiLogin:
policy: 1 # 1: Android/iOS/Windows/Mac/Web 同端仅单实例在线
maxNumOneEnd: 30 # 单端最大 Token 数
rpcMaxBodySize:
requestMaxBodySize: 8388608 # RPC 请求体上限(8MB)
responseMaxBodySize: 8388608 # RPC 响应体上限(8MB)
secret是服务间鉴权与消息加密的共享密钥,生产环境务必修改;queue决定消息中间件:默认kafka,可切换为redis,memory仅限独立部署(微服务模式不可用),对应判断逻辑见 cmd/main.go 的skipKafkaConfig;multiLogin控制多端登录策略,policy: 1表示每个平台仅允许一个实例在线;rpcMaxBodySize控制 RPC 传输体大小,发送超大消息时需关注。
独立部署模式(cmd/main.go 通过 config.SetStandalone() 开启)会复用共享的 MongoDB / Redis 连接(见 pkg/dbbuild/standalone.go),并将服务发现切换为进程内模式,实现单进程全服务运行。
开始开发 OpenIM:仓库内文档导航
参与 OpenIM 开发前,原文档建议先通过 GitHub Discussions 或 Slack 确认需求方向、发现 Bug 时先提交 issue,并阅读贡献者文档(CONTRIBUTING.md)。仓库 docs/contrib 目录沉淀了完整的开发配套文档,均可从仓库根目录直达:
- API 与错误码:docs/contrib/api.md、docs/contrib/error-code.md
- 环境与配置:docs/contrib/environment.md、docs/contrib/init-config.md
- 部署相关:docs/contrib/install-docker.md、docs/contrib/install-openim-linux-system.md、docs/contrib/offline-deployment.md、docs/contrib/prometheus-grafana.md、docs/contrib/mac-developer-deployment-guide.md
- 代码规范:docs/contrib/code-conventions.md、docs/contrib/go-code.md、docs/contrib/commit.md
- 开发流程:docs/contrib/development.md、docs/contrib/git-workflow.md、docs/contrib/github-workflow.md、docs/contrib/gitcherry-pick.md
- 工程工具:docs/contrib/protoc-tools.md、docs/contrib/util-go.md、docs/contrib/util-makefile.md、docs/contrib/util-scripts.md
- 测试与日志:docs/contrib/test.md、docs/contrib/logging.md、docs/contrib/bash-log.md
- 结构与其他:docs/contrib/directory.md、docs/contrib/cicd-actions.md、docs/contrib/local-actions.md、docs/contrib/linux-development.md、docs/contrib/version.md、docs/contrib/images.md
社区、会议与许可证
OpenIM 以开源社区方式运营,官方维护社区仓库、兴趣小组与 Slack/微信群,社区会议每周四晚举行并记录于 GitHub Discussions。项目采用 Apache 2.0 许可证(全文见 LICENSE);仓库中的 OpenIM 标识及其变体与动效版本(位于 assets/logo 与 assets/logo-gif)受著作权法保护。
小结
OpenIM 的定位决定了两条清晰的技术主线:客户端以 OpenIMSDK 提供一致的嵌入体验,服务端以微服务化的 OpenIMServer 提供可水平扩展的通信能力,二者通过 REST API 与 Webhooks 向业务系统开放。本仓库既是服务端的完整实现(网关、RPC、消息转移、推送、定时任务一应俱全),也沉淀了源码 / Docker / Kubernetes 三种部署路径与全套开发文档。对希望在自己的应用中快速获得即时通讯能力的团队而言,这是一套可以直接落地并持续演进的参考实现。
【免费下载链接】open-im-server
IM Chat OpenClaw
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考





