介绍
这个系列将主要介绍从服务端基于go语言从零开始构建一个基于群聊分布式IM系统。同时提供了对应的android客户端作为功能的演示和验证,前后端均开源,方便二次开发。
原则
基于go语言来构建的这个群聊系统被命令为schat,即simple chat,首先需要满足simple,简单性。
-
简单依赖
在构建一个系统时不可避免的要集成其他的许多框架来综合使用,这又不断引入新的学习成本,提高了心智负担,所以在schat的构建过程中极力避免引入第三方框架或者其他库(除了逼不得已)。能使用GO的标准库尽量使用标准库完成,虽然可能会有一些性能上的损失,不过以简单为第一要务。在实际部署过程中,基于普通的linux开发环境,只需要安装正常的go开发包、redis以及protobuf作为服务端的序列化通信即可 -
简单迁移
作为演示使用的schat服务端部署在单机系统内,这里假设以单机部署为例,在单台服务器失效时可以很容易的迁移群聊数据到新的设备,并维持以前的聊天场景 -
简单部署
演示时使用的单机部署,不过本身框架是基于分布式的,所以很容易平行扩展多机部署 -
简单开发
可以基于现有框架简单入手,进行二次开发(咳咳) -
简单安全
链接加密,通信加密及本地的数据加密 -
未完待续
功能
整个聊天系统以群聊为核心,所有功能均围绕群展开,目前包括以下功能:
- 账号注册 以名字为Key申请注册账号
- 创建群组 注册成功的用户可以创建聊天群和入群密码
- 申请入群 申请加入群
- 审批申请 群主审批请求,同意或拒绝
- 群内聊天 入群之后可以发送文本,图片,视频等内容
- 退出群聊 群员可以主动退群
- 踢出群聊 群主可以踢出成员
- 解散群组 群主可以解散群
框架
下面是schat的基本服务拓扑图,如下所示:
以上的每一组SET内的服务均可平行扩展,具体不同的服务功能后面详述
服务说明
对拓扑图里的进程功能及部署进行说明
-
conn_serv
客户端接入进程,负责维护客户端的连接,客户端使用TCP长链接接入 -
logic_serv
在线用户的数据缓存,处理用户本身的主要逻辑服务 -
db_logic_serv
与logic_serv配对的db代理进程,负责与reddis的连接与数据交互- 说明
conn_serv,logic_serv,db_logic_serv一般1:1:1配置对应作为一个用户连接,处理和数据的逻辑单元,按逻辑单元平行扩展
- 说明