🚀 开源分布式IM系统:致力于打造一款现代化、分布式、高并发、高可用的即时通讯解决方案!
前言
大家好,我是蝎子莱莱爱打怪 ,今天和大家分享一个我个人历时多年设计和开发的开源项目------xzll-im分布式即时通讯系统。
(本文是我对项目中 README 的摘抄,发表此文目的为了让更多人看到并参与到此项目中)
与IM结缘是在2022年,因为此类系统有足够大的挑战性,所以我对此如痴如醉。之前做过架构以及细节方面的设计,但是一直没有落地。不落地的设计不是好设计,所以有了这个项目。
📱 项目仓库
端侧 | 技术栈 | GitHub地址 | 描述 |
---|---|---|---|
🖥️ 服务端 | Java + Spring Cloud + Dubbo + Netty | xzll-im-server | 分布式IM后端服务 |
📱 客户端 | Flutter + Dart | xzll-im-flutter-client | 跨平台移动客户端 |
🎯 项目目标
想要设计一个好的IM系统,是很有难度的,本项目将尽可能达到以下几点:
- ✅ 高并发: 支持万级并发用户
- ✅ 高可用: 99.9% 系统可用性
- ✅ 高性能: 毫秒级消息延迟
- ✅ 稳定可靠: 完善的容错和恢复机制
- ✅ 灵活好扩展: 微服务架构,水平扩展支持
- ✅ 可观测: 完整的监控和链路追踪体系
🏗️ 系统架构设计

架构总览
整个系统采用微服务架构,主要包含以下核心服务:
- im-gateway: 统一API网关,负责路由分发、限流熔断
- im-auth: 认证服务,处理用户登录、JWT令牌管理
- im-connect: 长连接服务,基于Netty的WebSocket通信
- im-business: 核心业务服务,消息处理和业务逻辑
- im-console: 管理后台服务,提供运营管理接口
- im-data-sync: 数据同步服务,负责HBase到ES的数据同步
物理部署拓扑

节点配置表
节点IP | 节点角色 | 部署组件 | 端口 | 用途 |
---|---|---|---|---|
192.168.1.101 | 负载均衡+代理 | Nginx, FRP Client, IM服务(规划) | 80/443 | 流量入口、内网穿透 |
192.168.1.102 | 监控节点 | Prometheus, Grafana, Skywalking, IM服务(规划) | 9090/3000/8080 | 系统监控、链路追踪 |
192.168.1.150 | 应用服务 | IM微服务群、Nacos、Jenkins、Docker | 8081-8085/10001/8848 | 核心业务逻辑 |
192.168.1.130 | 集群主节点 | ZK Master, RMQ Master, HBase Master, HDFS NameNode, MySQL Master | 2181/9876/3306 | 集群协调、数据管理、主数据库 |
192.168.1.131 | 集群从节点1 | ZK Follower, RMQ Follower, HBase RegionServer, Redis, MySQL Slave | 2181/9876/6379/3306 | 数据存储、缓存、从数据库 |
192.168.1.132 | 集群从节点2 | ZK Follower, RMQ Follower, HBase RegionServer, ES | 2181/9876/9200 | 数据存储、搜索 |
🔄 核心业务流程
用户登录流程
sequenceDiagram
participant C as 客户端
participant G as Gateway
participant A as Auth服务
participant M as MySQL
participant R as Redis
participant CON as Connect服务
C->>G: 登录请求(username/password/device_type)
G->>A: 转发认证请求
A->>M: 查询用户信息验证凭据
M->>A: 返回用户数据
A->>A: 生成JWT Token
A->>R: 存储Token和用户ID映射
A->>G: 返回JWT Token
G->>C: 登录成功响应
Note over C: 客户端使用Token建立WebSocket连接
C->>CON: WebSocket连接(携带Token)
CON->>R: 验证Token有效性
R->>CON: Token验证通过
CON->>C: WebSocket连接建立成功
单聊消息发送流程
流程图版本(逻辑流向)
flowchart LR
A[客户端发送消息] --> B[Connect服务接收]
B --> C[策略分发C2CMsgSendStrategyImpl]
%% 并行处理分支
C --> D{并行处理}
D --> E[发送到RocketMQ
异步业务处理] D --> F[查询接收方在线状态
实时消息路由] %% 异步业务处理分支 E --> G[Business服务消费MQ] G --> H[C2CSendMsgHandler处理] H --> I{并行数据存储} I --> J[MySQL存储会话信息] I --> K[HBase存储消息记录] K --> L[触发ES数据同步] L --> M[DataSync批量写入ES] J --> N[增加未读计数Redis] K --> N N --> O[Dubbo RPC发送Server ACK] O --> P[推送ACK给发送方] %% 实时消息路由分支 F --> Q{接收方状态判断} Q -->|在线且在本机| R[直接推送WebSocket消息] Q -->|在线但在其他机器| S[Dubbo RPC转发到目标机器] Q -->|离线| T[发送离线消息事件] S --> U[目标机器推送消息] T --> V[Business处理离线消息] V --> W[更新HBase状态为离线] W --> X[存储离线消息到Redis] X --> Y[伪造未读ACK给发送方] %% 消息确认流程 R --> Z[接收方发送ACK] U --> Z Z --> AA[Connect转发ACK到MQ] AA --> BB[Business处理ACK] BB --> CC[更新HBase消息状态] CC --> DD[触发状态更新ES同步] CC --> EE[清零未读计数if已读] EE --> FF[Dubbo发送ACK给发送方] FF --> GG[推送ACK确认] %% 样式定义 classDef connectService fill:#e1f5fe classDef businessService fill:#f3e5f5 classDef mq fill:#fff3e0 classDef storage fill:#e8f5e8 classDef client fill:#ffebee class B,C,F,Q,Z,AA connectService class G,H,V,BB businessService class E,L,T,AA mq class J,K,M,W,CC storage class A,R,U,Y,GG client
异步业务处理] D --> F[查询接收方在线状态
实时消息路由] %% 异步业务处理分支 E --> G[Business服务消费MQ] G --> H[C2CSendMsgHandler处理] H --> I{并行数据存储} I --> J[MySQL存储会话信息] I --> K[HBase存储消息记录] K --> L[触发ES数据同步] L --> M[DataSync批量写入ES] J --> N[增加未读计数Redis] K --> N N --> O[Dubbo RPC发送Server ACK] O --> P[推送ACK给发送方] %% 实时消息路由分支 F --> Q{接收方状态判断} Q -->|在线且在本机| R[直接推送WebSocket消息] Q -->|在线但在其他机器| S[Dubbo RPC转发到目标机器] Q -->|离线| T[发送离线消息事件] S --> U[目标机器推送消息] T --> V[Business处理离线消息] V --> W[更新HBase状态为离线] W --> X[存储离线消息到Redis] X --> Y[伪造未读ACK给发送方] %% 消息确认流程 R --> Z[接收方发送ACK] U --> Z Z --> AA[Connect转发ACK到MQ] AA --> BB[Business处理ACK] BB --> CC[更新HBase消息状态] CC --> DD[触发状态更新ES同步] CC --> EE[清零未读计数if已读] EE --> FF[Dubbo发送ACK给发送方] FF --> GG[推送ACK确认] %% 样式定义 classDef connectService fill:#e1f5fe classDef businessService fill:#f3e5f5 classDef mq fill:#fff3e0 classDef storage fill:#e8f5e8 classDef client fill:#ffebee class B,C,F,Q,Z,AA connectService class G,H,V,BB businessService class E,L,T,AA mq class J,K,M,W,CC storage class A,R,U,Y,GG client
💻 技术栈总览
技术架构图谱
技术层次 | 技术选型 | 状态 | 用途说明 |
---|---|---|---|
📱 客户端层 | Flutter + Dart | ✅ | 跨平台移动客户端开发 |
🌐 接入层 | Nginx | ✅ | 负载均衡、反向代理、HTTPS终结 |
🚪 网关层 | Spring Cloud Gateway | ✅ | 统一API网关、路由分发、限流熔断 |
🔧 业务层 | Spring Boot + Spring Cloud | ✅ | 微服务应用框架、服务治理 |
🔗 通信层 | Netty + WebSocket + Dubbo | ✅ | 长连接通信、RPC服务调用 |
🔐 安全层 | OAuth2 + Spring Security + JWT | ✅ | 身份认证、权限控制、令牌管理 |
⚙️ 中间件层 | Nacos + ZooKeeper + RocketMQ | ✅ | 服务注册发现、消息队列、配置管理 |
💾 存储层 | MySQL + HBase + Redis + ES | ✅ | 关系数据、大数据、缓存、搜索 |
📊 监控层 | Prometheus + Grafana + Skywalking | ✅/⏳ | 性能监控、链路追踪、可视化 |
🚀 部署层 | Jenkins + Docker Compose | ✅ | CI/CD流水线、容器编排部署 |
详细技术栈
分类 | 技术 | 版本 | 状态 | 说明 |
---|---|---|---|---|
📱 前端 | Flutter | 3.24+ | ✅ | 跨平台UI框架,支持Android/iOS |
📱 前端 | Dart | 3.4.4+ | ✅ | 现代化编程语言,强类型安全 |
🖥️ 后端 | Java | 11 | ✅ | 核心编程语言 |
🖥️ 后端 | Spring Boot | 2.7.0 | ✅ | 应用开发框架 |
🖥️ 后端 | Spring Cloud | 2021.0.3 | ✅ | 微服务治理框架 |
🖥️ 后端 | Spring Cloud Alibaba | 2021.0.1.0 | ✅ | 阿里云微服务套件 |
🖥️ 后端 | Netty | 4.1.75 | ✅ | 高性能网络通信框架 |
🖥️ 后端 | Dubbo | 3.0.7 | ✅ | 高性能RPC框架 |
⚙️ 中间件 | Nacos | 2.0.3 | ✅ | 微服务注册中心、配置中心、服务发现 |
⚙️ 中间件 | RocketMQ | 5.3.0 | ✅ | 分布式消息队列、削峰填谷 |
💾 存储 | MySQL | 8.0.23 | ✅ | 关系型数据库、主从复制 |
💾 存储 | HBase | 2.6.1 | ✅ | 分布式NoSQL、海量消息存储 |
💾 存储 | Redis | 6.2.6 | ✅ | 内存数据库、缓存、分布式锁 |
💾 存储 | Elasticsearch | 7.17.5 | ✅ | 搜索引擎、消息全文检索 |
✨ 核心功能概览
✅ 已实现功能
- 🔐 用户认证: 注册、登录(OAuth2 + JWT)
- 💬 单聊消息: 文字消息发送、撤回、ACK确认
- 📊 消息存储: HBase分布式存储 + Elasticsearch搜索
- 🔄 离线消息: Push推送机制(Pull拉取开发中)
- ⚡ 实时通信: WebSocket长连接 + Netty高性能
- 🆔 消息ID: 分布式唯一ID生成算法
- 💓 心跳检测: 服务端自动剔除超时连接
🚧 开发中功能
- 📱 Flutter客户端: 聊天界面和交互逻辑
- 📋 会话管理: 最近会话列表
📋 规划功能
- 🗨️ 群聊系统: 群组消息、群管理(写扩散模型)
- 👥 好友系统: 好友关系管理
- 📁 多媒体消息: 图片、语音、视频消息
- 🔍 消息搜索: 基于Elasticsearch的全文检索
- 📱 客户端增强: 断线重连、消息排序、防重处理
- 🎯 会话功能: 置顶、删除、免打扰
- 📹 音视频通话: WebRTC实时通信
- 📺 直播功能: 实时直播推流
🚀 快速启动
🖥️ 服务端启动
项目提供了线上测试环境,相关依赖的中间件都已经部署在服务器上,公网可流畅连接。
IDEA中运行
直接下载此项目main分支,一键启动即可:
bash
# 1. 克隆项目
git clone https://github.com/598572/xzll-im-server.git
cd xzll-im-server
# 2. 导入IDEA项目
# 打开IntelliJ IDEA,选择"Open",选择项目根目录
# 等待Maven依赖下载完成(首次可能需要5-10分钟)
微服务启动顺序
重要: 必须按以下顺序启动,确保服务依赖关系正确:
-
im-auth (认证服务) - 端口:8082
- 位置:
im-auth/src/main/java/com/xzll/auth/IMAuthServiceApplication.java
- 作用: 用户认证、JWT令牌生成
- 位置:
-
im-connect (长连接服务) - 端口:10001
- 位置:
im-connect/im-connect-service/src/main/java/com/xzll/connect/IMConnectServiceApplication.java
- 作用: WebSocket连接管理、实时消息推送
- 位置:
-
im-business (业务服务) - 端口:8083
- 位置:
im-business/im-business-service/src/main/java/com/xzll/business/IMBusinessServiceApplication.java
- 作用: 核心业务逻辑、消息处理
- 位置:
-
im-console (控制台服务) - 端口:8084
- 位置:
im-console/im-console-service/src/main/java/com/xzll/console/IMConsoleServiceImplApplication.java
- 作用: 管理后台接口
- 位置:
-
im-data-sync (数据同步服务) - 端口:8085
- 位置:
im-data-sync/src/main/java/com/xzll/datasync/IMDataSyncApplication.java
- 作用: HBase到Elasticsearch数据同步
- 位置:
📱 Flutter客户端启动
bash
# 1. 克隆Flutter客户端
git clone https://github.com/598572/xzll-im-flutter-client.git
cd xzll-im-flutter-client
# 2. 安装依赖
flutter pub get
# 3. 检查Flutter环境
flutter doctor
# 4. 启动应用(确保设备已连接)
flutter run
🤝 如何参与开发
🔥 高优先级任务
- 📱 客户端开发: Flutter前端界面和交互
- 🗨️ 群聊功能: 群组消息、群管理
- 👥 好友系统: 好友关系管理
- 🔍 消息搜索: 基于Elasticsearch的全文检索
- 📁 多媒体消息: 图片、语音、视频消息
🌟 中优先级任务
- 📋 会话管理: 置顶、删除、免打扰
- 🔄 断线重连: 客户端重连机制
- 📊 性能优化: 系统性能调优
- 📖 文档完善: 技术文档和API文档
👶 新手友好任务
- 📝 文档完善: 补充代码注释、API文档
- 🧪 测试编写: 添加单元测试用例
- 🎨 UI优化: Flutter界面美化
- 🐛 简单Bug修复: 修复已知小问题
🌿 分支管理
bash
# 创建功能分支
git checkout -b feature/your-feature-name
# 示例分支命名
feature/group-chat # 群聊功能
feature/friend-system # 好友系统
feature/message-search # 消息搜索
bugfix/connection-issue # 连接问题修复
docs/api-documentation # API文档编写
📝 提交信息规范
bash
# 格式: type(scope): description
# 功能开发
feat(auth): 添加OAuth2认证功能
feat(chat): 实现群聊消息发送
# 问题修复
fix(connect): 修复WebSocket连接断开问题
fix(ui): 修复聊天界面滚动卡顿
# 文档更新
docs(api): 更新REST API文档
docs(readme): 完善部署说明
📋 功能开发进度表
图例说明:
- ⬜ :未实现
- ⏳ :正在进行中
- ✅ :已实现
- ❌ :已取消
🔐 登录&注册
功能 | 当前进度 | 实现者 | 备注 |
---|---|---|---|
注册 | 后端✅,前端✅ | 蝎子莱莱爱打怪 | 用户注册功能完整实现 |
登录 | 后端✅,前端✅ | 蝎子莱莱爱打怪 | 登录成功后按算法选取可用长连接服务 |
💬 单聊相关
功能 | 当前进度 | 实现者 | 备注 |
---|---|---|---|
单聊(发文字) | 后端✅,前端⏳ | 后端(蝎子莱莱爱打怪),前端(蝎子莱莱爱打怪) | 🔥 高优先级 |
单聊(发图片) | 后端⬜,前端⬜ | - | 🔥 高优先级 |
单聊(发语音) | 后端⬜,前端⬜ | - | 🔥 高优先级 |
单聊(撤回) | 后端✅,前端⬜ | 后端(蝎子莱莱爱打怪) | 🔥 高优先级 |
单聊(ACK确认) | 后端✅,前端⬜ | 后端(蝎子莱莱爱打怪) | 🔥 高优先级 |
🗨️ 群聊相关
功能 | 当前进度 | 备注 |
---|---|---|
群聊(方案/表设计) | ⬜ | 🚀 高级任务 - 采用写扩散模型 |
群聊(发文字) | 后端⬜,前端⬜ | 🚀 高级任务 |
群聊(群管理) | 后端⬜,前端⬜ | 🚀 高级任务 - 创建/退出/解散/角色管理 |
📋 会话相关
功能 | 当前进度 | 备注 |
---|---|---|
最近会话列表 | 后端⏳,前端⏳ | 🔥 高优先级 |
置顶 | 后端⬜,前端⬜ | 🌟 中优先级 |
删除会话 | 后端⬜,前端⬜ | 🌟 中优先级 |
🔧 其他功能
功能 | 当前进度 | 备注 |
---|---|---|
离线消息 | 后端✅,前端⬜ | Push✅+Pull⬜ |
客户端断线重连 | 前端⬜ | 🔥 高优先级 - 后端无需参与 |
聊天消息搜索 | 后端⬜,前端⬜ | 🌟 中优先级 - 基于ES |
消息失败重试 | 后端✅,前端⬜ | 🔥 高优先级 |
💬 交流与合作
👨💻 项目维护者
蝎子莱莱爱打怪
- 📧 邮箱: h163361631@163.com
- 📝 博客: 稀土掘金
- 🐙 GitHub: @598572
微信:

💬 交流群
加我微信 我拉入群。
加入步骤:
- 扫码添加个人微信(15230853779)
- 说明来意(参与开源项目)
- 邀请进入技术交流群
📧 联系方式
- 项目讨论 : GitHub Discussions
- 问题反馈 : GitHub Issues
- 代码贡献 : Pull Requests
🎯 项目亮点
🏗️ 架构设计亮点
- 微服务架构: 采用Spring Cloud生态,服务拆分合理
- 高性能通信: Netty + WebSocket实现高并发长连接
- 消息可靠性: RocketMQ削峰填谷,保证消息不丢失
- 数据存储: MySQL + HBase + Redis + ES多层存储架构
- 服务治理: Nacos + Dubbo实现服务注册发现和RPC调用
💡 技术创新点
- 分布式消息ID: 自研分布式唯一ID生成算法
- 读扩散群聊: 群聊采用读扩散模型,性能更优
- 离线消息: Push + Pull双重保障离线消息可达
- 实时路由: 智能路由算法,支持跨机器消息推送
- 数据同步: 异步数据同步机制,HBase到ES实时同步
- 分布式水平扩容: im-connect、im-data-sync、im-business均可水平横向无限扩容
🔧 工程化实践
- CI/CD: Jenkins自动化构建部署
- 容器化: Docker Compose一键部署
- 监控体系: Prometheus + Grafana + Skywalking全栈监控
- 代码规范: 统一的编码规范和提交规范
- 文档体系: 完善的技术文档和API文档
🌟 写在最后
这个项目承载着我对技术的热爱和对开源精神的信仰。每一行代码都经过深思熟虑,每一个架构决策都有其考量。我希望这个项目不仅仅是一个IM系统,更是一个学习和交流的平台。
如果你对分布式系统、即时通讯、微服务架构感兴趣,或者想要参与开源项目,欢迎加入我们!无论你是资深开发者还是初学者,都能在这里找到适合自己的任务。
让我们一起打造优秀的开源IM系统! 🚀
🔗 相关链接
- 服务端仓库 : github.com/598572/xzll...
- 客户端仓库 : github.com/598572/xzll...
- 技术博客 : juejin.cn/user/123990...
- 在线演示: 正在准备中...
如果这个项目对你有帮助,请给个⭐Star支持一下!