# echo-im **Repository Path**: Austin_00/echo-im ## Basic Information - **Project Name**: echo-im - **Description**: 一个IM(即时通讯)项目的后端系统。支持IM系统核心功能:好友、私聊、群聊、离线消息、发送语音、图片、文件、emoji表情、回执消息、视频聊天等 严格遵循IM系统的四大原则:实时性、幂等性、不丢失、时序性。 主要基于 Spring Boot 和 Netty 开发 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: https://gitee.com/brother-one/echo-im - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 40 - **Created**: 2025-12-12 - **Last Updated**: 2025-12-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

logo

Echo IM 1.2.0

基于 SpringBoot + Netty 的高性能即时通讯系统

--- ## 📋 项目简介 Echo IM 是一个**生产级**即时通讯系统,采用微服务架构 + DDD 领域驱动设计,严格遵循 IM 四大核心原则(实时性、不丢失、幂等性、时序性)。 **核心亮点**: - ✅ 多消息中间件架构(RabbitMQ/Redis/RocketMQ可切换) - ✅ 去中心化消息推送,无单点故障 - ✅ 离线消息双重存储(Redis + MySQL) - ✅ 应用层 ACK 机制 + MQ 任务补偿 - ✅ Flyway 数据库版本管理 - ✅ Vue3 + TypeScript 前端 **适用场景**:IM 系统学习、毕设项目、简历加分、二次开发 --- ## 🚀 快速开始 ### 环境要求 | 组件 | 版本 | |------|------| | JDK | 17+ | | Maven | 3.6+ | | MySQL | 8.0+ | | Redis | 6.0+ | | RabbitMQ | 3.x (可选 Redis/RocketMQ) | | Nginx | 最新版 (生产环境必需) | ### Docker Compose 一键启动 ```bash cd doc/dev-ops docker-compose -f docker-compose-enviroment.yml up -d ``` 启动后服务: - MySQL: `localhost:3306` (root/test123456) - Redis: `localhost:6379` - RabbitMQ: `localhost:5672` (guest/guest) - RabbitMQ 管理界面: http://localhost:15672 ### 配置说明 **1. 数据库初始化** v1.2.0 使用 Flyway 自动迁移,首次启动会自动创建所有表结构和索引。 **2. 核心配置(application-dev.yml)** ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/echo_im username: root password: test123456 data: redis: host: 127.0.0.1 port: 6379 rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest # 消息中间件选择(rabbitmq/redis/rocketmq/load-balanced) im: message-broker: type: rabbitmq # 开发环境推荐单一中间件 ``` ### 启动服务 **开发环境(IDEA)**: ``` 1. im-engin-server -> ImEnginServerApplication 2. im-platform-server -> ImPlatformServerApplication 3. im-storage-server -> ImStorageServerApplication ``` **生产环境(JAR)**: ```bash # 打包 mvn clean package -DskipTests # 启动 nohup java -jar im-engin-server/target/im-engin-server.jar & nohup java -jar im-platform-server/target/im-platform-server.jar & nohup java -jar im-storage-server/target/im-storage-server.jar & ``` ### Nginx 负载均衡配置 **为什么需要 Nginx?** 前端需要连接 WebSocket,多个 im-engin-server 实例时需要 Nginx 做负载均衡。 **配置示例**: ```nginx # WebSocket 负载均衡(ip_hash 保持会话一致性) upstream websocket_backend { ip_hash; server 127.0.0.1:9091; server 127.0.0.1:9092; server 127.0.0.1:9093; } # HTTP API 负载均衡 upstream api_backend { server 127.0.0.1:8080; server 127.0.0.1:8180; } server { listen 80; server_name im.example.com; # WebSocket 代理 location /ws { proxy_pass http://websocket_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # HTTP API 代理 location /api/ { proxy_pass http://api_backend/; } } ``` **详细配置**:见 `doc/nginx/echo-im.conf` **前端配置**: ```typescript // 生产环境通过 Nginx const wsUrl = 'wss://im.example.com/ws'; const apiUrl = 'https://im.example.com/api'; ``` ### 验证部署 ```bash # 1. 检查服务端口 lsof -i:8080,8081,9091 # 2. API 文档 curl http://localhost:8080/doc.html # 3. 注册测试用户 curl -X POST http://localhost:8080/auth/register \ -H "Content-Type: application/json" \ -d '{"username":"test","password":"123456"}' # 4. WebSocket 连接测试 # 浏览器访问: http://www.websocket-test.com/ # 连接地址: ws://localhost:9091/ws ``` --- ## 📖 核心特性 ### IM 四大原则实现 | 原则 | 实现方案 | |------|---------| | **实时性** | Netty NIO + WebSocket 长连接 + RabbitMQ 异步解耦 | | **不丢失** | 应用层 ACK + 离线消息双存储 + MQ 任务补偿 | | **幂等性** | 客户端 SEQ + 服务端 MsgId 双重保证 | | **时序性** | 雪花算法 MsgId + SEQ 局部时序 | ### 功能清单 - ✅ **多端登录**:同一用户多终端,同终端互斥 - ✅ **消息类型**:文本、图片、语音、文件、视频、表情 - ✅ **消息功能**:离线消息、历史消息、消息撤回、已读回执 - ✅ **好友管理**:添加、删除、备注、在线状态 - ✅ **群组功能**:创建、解散、邀请、移除、@功能 - ✅ **文件存储**:MinIO 对象存储 - ✅ **多消息中间件**:RabbitMQ/Redis/RocketMQ 可切换 --- ## 🔌 技术栈 ### 后端 | 技术 | 版本 | 说明 | |------|------|------| | Spring Boot | 3.3.1 | 微服务框架 | | Netty | - | 高性能网络框架 | | MySQL | 8.0+ | 数据库 | | Redis | 6.0+ | 缓存 + 用户状态 | | RabbitMQ | 3.x | 消息队列(可切换Redis/RocketMQ) | | Flyway | 10.10.0 | 数据库版本管理 | | Sa-Token | 1.38.0 | 认证授权 | | MinIO | 8.5.1 | 对象存储 | | MyBatis-Plus | 3.5.7 | ORM 框架 | ### 前端 | 技术 | 版本 | 说明 | |------|------|------| | Vue | 3.x | 渐进式框架 | | TypeScript | 5.x | 类型安全 | | Vite | 5.x | 构建工具 | | Element Plus | 2.x | UI 组件库 | | Pinia | 2.x | 状态管理 | --- ## 🏗️ 架构设计 ### 总体架构 ``` ┌─────────────┐ │ Nginx │ 负载均衡 + 反向代理 └──────┬──────┘ │ ┌──────┴──────────────────────────────┐ │ │ │ ┌─────────────┐ ┌──────────────┐ │ │ │ im-platform │ │ im-engin │ │ │ │ (8080) │ │ (9091) │ │ │ └──────┬──────┘ └──────┬───────┘ │ │ │ │ │ │ └────────┬───────┘ │ │ │ │ │ ┌───────────────▼──────────────┐ │ │ │ RabbitMQ / Redis / RocketMQ│ │ │ └───────────────┬──────────────┘ │ │ │ │ │ ┌───────────────▼──────────────┐ │ │ │ im-storage (8082) │ │ │ └──────────────────────────────┘ │ └─────────────────────────────────────┘ │ ┌──────┴──────┐ │ │ ┌───▼───┐ ┌────▼────┐ │ MySQL │ │ Redis │ └───────┘ └─────────┘ ``` ### 消息流转 ``` 用户A 发消息 ↓ im-platform-server (接收HTTP请求) ↓ MessageBroker (路由到对应中间件) ↓ RabbitMQ/Redis/RocketMQ ↓ im-engin-server (用户B所在服务器) ↓ WebSocket 推送给用户B ``` ### 多消息中间件架构 **核心设计**:每个 im-engin-server 只连接一个中间件,im-platform-server 根据用户所在的 serverId 智能路由。 ``` im-engin-server-1 → RabbitMQ im-engin-server-2 → Redis im-engin-server-3 → RocketMQ im-platform-server → LoadBalancer → 选择对应的中间件发送 ``` **负载均衡策略**: - **round-robin**:轮询 - **random**:随机 - **weighted**:加权 - **hash**:哈希(推荐,保证同一serverId路由到同一中间件) --- ## 📂 项目结构 ``` echo-im/ ├── im-common/ # 公共模块(工具类、常量、异常) ├── im-repository/ # 仓储模块(数据持久化) ├── im-infrastructure/ # 基础设施(Redis、MQ、MinIO) │ └── mq/ # 消息中间件抽象层 │ ├── MessageBroker.java # 统一接口 │ ├── impl/ │ │ ├── RabbitMQMessageBroker.java │ │ ├── RedisMessageBroker.java │ │ └── RocketMQMessageBroker.java │ └── strategy/ # 负载均衡策略 ├── im-domain/ # 领域模块(核心业务逻辑) ├── im-client-starter/ # 客户端 SDK(消息路由、用户状态) ├── im-engin-server/ # 消息引擎(Netty + WebSocket) ├── im-platform-server/ # 平台服务(HTTP API) ├── im-storage-server/ # 存储服务(异步持久化) ├── im-offline-notify-server/ # 离线通知(邮件、推送) ├── echo-im-web/ # Vue3 前端 └── doc/ ├── nginx/ # Nginx 配置 ├── sql/ # SQL 脚本 └── md/ # 技术文档 ``` --- ## 📝 技术文档 | 文档 | 说明 | |------|------| | [架构设计](doc/ARCHITECTURE.md) | 整体架构 + 消息流转 + 多中间件设计 | | [Nginx配置](doc/nginx/README.md) | 负载均衡配置说明 | | [IM核心特性](doc/md/IM核心特性.md) | 四大原则详解 | | [ACK队列](doc/md/ACK队列技术选型.md) | ACK机制实现 | | [CHANGELOG](CHANGELOG.md) | 版本更新日志 | --- ## 🛠️ 开发进度 ### v1.2.0 (当前版本) ✅ - [x] 多消息中间件支持(RabbitMQ/Redis/RocketMQ) - [x] 智能负载均衡(4种策略) - [x] Flyway 数据库迁移 - [x] Vue3 前端重构 - [x] 数据库索引优化(27个索引) - [x] BCrypt 密码加密 - [x] 全局异常处理 ### v1.3.0 (规划中) 🚧 - [ ] IM 管理控制台 - [ ] 数据统计面板 - [ ] 实时监控大屏 - [ ] 消息云端审核 - [ ] 好友分组 - [ ] 黑名单功能 ### v2.0.0 (未来) 🔮 - [ ] 音视频通话 - [ ] 屏幕共享 - [ ] 移动端 SDK - [ ] Elasticsearch 消息搜索 - [ ] Kubernetes 部署 --- ## 🏗️ 参与贡献 ### 分支说明 | 分支 | 说明 | |------|------| | master | 主分支,稳定版本 | | develop | 开发分支,接受 PR | ### 贡献步骤 1. Fork 项目到你的仓库 2. 创建特性分支:`git checkout -b feature/xxx` 3. 提交代码:`git commit -m 'Add xxx'` 4. 推送到分支:`git push origin feature/xxx` 5. 提交 Pull Request ### 提问反馈 - [Gitee Issue](https://gitee.com/brother-one/echo-im/issues) - 微信交流群(见下方二维码) --- ## 交流合作 ![微信群](doc/image/fbc33e8a11ed71b5ca6663fec6b80a9.jpg) --- ## 📜 开源协议 [MIT License](LICENSE) ---

⭐ 如果这个项目对你有帮助,请给个 Star 支持一下!⭐

Made with ❤️ by Echo IM Team
© 2024 Echo IM. All rights reserved.