演示
本次主要涉及到 IM 即时通讯,所以特地录了两段视频演示(群聊、私聊)。
点击下方链接可以查看视频版 Demo。
也在公网部署了一套演示环境,想要试一试的可以联系我加入内测群获取账号一起尬聊😋。
架构设计
下面来看看具体的架构设计。
CIM
中的各个组件均采用SpringBoot
构建。
- 采用
Netty + Google Protocol Buffer
构建底层通信。
Redis
存放各个客户端的路由信息、账号信息、在线状态等。
Zookeeper
用于IM-server
服务的注册与发现。
整体主要由以下模块组成:
cim-server
IM
服务端;用于接收 client
连接、消息透传、消息推送等功能。
支持集群部署。
cim-forward-route
消息路由服务器;用于处理消息路由、消息转发、用户登录、用户下线以及一些运营工具(获取在线用户数等)。
cim-client
IM
客户端;给用户使用的消息终端,一个命令即可启动并向其他人发起通讯(群聊、私聊);同时内置了一些常用命令方便使用。
流程图
整体的流程也比较简单,流程图如下:
- 客户端向
route
发起登录。
- 登录成功从
Zookeeper
中选择可用IM-server
返回给客户端,并保存登录、路由信息到Redis
。
- 客户端向
IM-server
发起长连接,成功后保持心跳。
- 客户端下线时通过
route
清除状态信息。
所以当我们自己部署时需要以下步骤:
- 搭建基础中间件
Redis、Zookeeper
。
- 部署
cim-server
,这是真正的 IM 服务器,为了满足性能需求所以支持水平扩展,只需要注册到同一个Zookeeper
即可。
- 部署
cim-forward-route
,这是路由服务器,所有的消息都需要经过它。由于它是无状态的,所以也可以利用Nginx
代理提高可用性。
cim-client
真正面向用户的客户端;启动之后会自动连接 IM 服务器便可以在控制台收发消息了。
更多使用介绍可以参考快速启动。
详细设计
接下来重点看看具体的实现,比如群聊、私聊消息如何流转;IM 服务端负载均衡;服务如何注册发现等等。
IM 服务端
先来看看服务端;主要是实现客户端上下线、消息下发等功能。
首先是服务启动:
由于是在 SpringBoot
中搭建的,所以在应用启动时需要启动 Netty
服务。
从 pipline
中可以看出使用了 Protobuf
的编解码(具体报文在客户端中分析)。
注册发现
需要满足 IM
服务端的水平扩展需求,所以 cim-server
是需要将自身数据发布到注册中心的。
这里参考之前分享的《搞定服务注册与发现》有具体介绍。
所以在应用启动成功后需要将自身数据注册到 Zookeeper
中。