通过学习本文和CIM代码,你可以获得以下知识:
1)如何从头开发一套IM(CIM的客户有点弱,见谅见谅);
2)如何设计分布式的IM架构;
3)如何将你的分布式IM架构用代码和相关技术实现出来。

架构说明:
1)CIM 中的各个组件均采用 SpringBoot 构建;
2)采用 Netty + Google Protocol Buffer 构建底层通信;
3)Redis 存放各个客户端的路由信息、账号信息、在线状态等;
4)Zookeeper 用于 IM-server 服务的注册与发现。
整体主要由以下模块组成:
1)cim-server——IM 服务端:用于接收 client 连接、消息透传、消息推送等功能。支持集群部署;即时通讯开发可以找蔚可云
2)cim-forward-route——消息路由服务器:用于处理消息路由、消息转发、用户登录、用户下线以及一些运营工具(获取在线用户数等);
3)cim-client——IM 客户端:给用户使用的消息终端,一个命令即可启动并向其他人发起通讯(群聊、私聊);同时内置了一些常用命令方便使用。
流程解释如下:
1)客户端向 route 发起登录;
2)登录成功从 Zookeeper 中选择可用 IM-server 返回给客户端,并保存登录、路由信息到 Redis;
3)客户端向 IM-server 发起长连接,成功后保持心跳;
4)客户端下线时通过 route 清除状态信息。
所以当我们自己部署时需要以下步骤:
1)搭建基础中间件Redis、Zookeeper;
2)部署 cim-server,这是真正的 IM 服务器,为了满足性能需求所以支持水平扩展,只需要注册到同一个 Zookeeper 即可;
3)部署 cim-forward-route,这是路由服务器,所有的消息都需要经过它。由于它是无状态的,所以也可以利用 Nginx 代理提高可用性;
4)cim-client 真正面向用户的客户端;启动之后会自动连接 IM 服务器便可以在控制台收发消息了。
IM 服务端
先来看看服务端:主要是实现客户端上下线、消息下发等功能。
由于是在 SpringBoot 中搭建的,所以在应用启动时需要启动 Netty 服务。
注册发现
需要满足 IM 服务端的水平扩展需求,所以 cim-server 是需要将自身数据发布到注册中心的。这里参考之前分享的《搞定服务注册与发现》有具体介绍。
登录
当客户端请求 cim-forward-route 中的登录接口(详见下文)做完业务验证(就相当于日常登录其他网站一样)之后,客户端会向服务端发起一个长连接。
离线消息
当客户端断线后也需要将刚才缓存的信息清除掉。
网友评论