
二、技术架构总览:分层设计与核心模块
盒子IM采用微服务架构,分为以下核心模块:
-
im-platform:业务平台服务(HTTP接口),处理用户注册、好友关系、消息存储等业务逻辑。
-
im-server:消息推送服务(WebSocket),独立于业务,负责实时消息的推送与接收。
-
im-client:消息推送SDK,支持第三方服务集成,实现与im-server的通信。
-
im-common:公共包,封装通用工具类、异常处理等。
-
前端层:Web端(Vue)、移动端(Uniapp)、管理后台(React)。
架构亮点:
-
无状态设计:im-server不存储业务数据,仅负责消息流转,支持水平扩展。
-
集群化部署:通过Redis实现节点间消息同步,支持万级并发。

三、核心技术实现:跨节点消息推送的“黑科技”
1. 问题背景
当用户分布在不同im-server节点时,如何保证消息的可靠投递?盒子IM通过Redis队列+节点路由实现了跨节点消息推送。
2. 关键设计
-
Redis路由表:存储用户ID与所在节点(serverId)的映射关系。
-
队列模型:每个节点对应一个Redis List(key为
im:unread:{serverId}),消息根据接收者节点ID投递到对应队列。 -
消费者模型:每个im-server仅消费自己队列中的消息,避免跨节点竞争。
3. 流程图解
graph TD
A[用户发送消息] --> B[im-platform查询接收者节点]
B --> C{同一节点?}
C -->|是| D[直接推送WebSocket]
C -->|否| E[写入目标节点Redis队列]
E --> F[目标节点im-server消费队列并推送]
4. 技术优势
-
解耦性:消息投递与业务逻辑分离,降低系统耦合。
-
高可用性:Redis集群保障队列数据安全,节点故障可快速切换。
-
扩展性:新增节点只需修改路由表,无需重启服务。

四、音视频通话:基于WebRTC的端到端通信
盒子IM的音视频通话功能完全基于原生WebRTC实现,支持单人/多人通话,核心设计如下:
1. 架构要点
-
信令服务器:使用Netty实现,负责SDP交换、ICE候选收集。
-
NAT穿透:通过STUN/TURN服务器解决内网穿透问题。
-
媒体流处理:采用PeerConnection直接传输,降低服务器压力。
2. 关键优化
-
动态码率控制:根据网络状况自动调整视频分辨率。
-
回声消除:集成WebRTC内置算法,提升通话质量。
-
多端同步:支持Web、App、H5等多端同时加入会议。

五、性能优化:从单机到集群的演进之路
1. 负载均衡
-
Nginx+Lua:实现WebSocket连接的动态负载均衡。
-
一致性哈希:将用户请求均匀分配到不同节点。
2. 存储优化
-
消息持久化:使用MySQL+Redis混合存储,高频消息缓存到Redis。
-
读写分离:数据库主从架构提升查询性能。
3. 数据同步
-
Redis Pub/Sub:节点间实时同步在线状态、群组变更等信息。
六、多端兼容:Uniapp的跨平台实践
盒子IM的移动端基于Uniapp开发,实现了App、H5、微信小程序多端兼容:
-
统一代码库:通过条件编译(
#ifdef)适配不同平台。 -
消息同步:基于WebSocket心跳机制,保持多端在线状态一致。
-
离线推送:集成厂商推送通道(华为、小米等),确保离线消息可达。

七、本地启动
1.安装运行环境
-
安装node:v18.19.0
-
安装jdk:17
-
安装maven:3.9.6
-
安装mysql:8.0,账号密码分别为root/root,创建名为im_platform的数据库,运行db/im_platfrom.sql脚本
-
安装redis:6.2
-
安装minio:RELEASE.2024-xx,使用默认账号、密码、端口
2.启动后端服务
mvn clean package
java -jar ./im-platform/target/im-platform.jar
java -jar ./im-server/target/im-server.jar
3.启动前端web
cd im-web
npm install
npm run serve
访问 http://localhost:8080
4.启动uniapp-h5 将im-uniapp目录导入HBuilderX,点击菜单"运行"->"开发环境-h5" 访问 http://localhost:5173

八、商业与开源:从技术到产品的落地
盒子IM提供商业版与开源版双重选择:
-
商业版:包含管理后台、高可用集群方案、技术支持等。
-
开源版:核心功能开放,适合学习与二次开发。
开源地址:
-
后端:Gitee仓库
-
管理后台:Gitee仓库

1226

被折叠的 条评论
为什么被折叠?



