本篇主要是对于IM项目中的好友管理和网关服务进行一个描述,由于代码逻辑还是有点复杂的,所以这里只是列一个大纲,具体的内容去看仓库中的代码
好友管理服务
功能设计
对于好友管理服务来说,要实现以下的内容:
- 好友列表的获取:用户登录成功后,获取自己的好友列表
- 申请好友:向某个指定用户发送一个好友申请
- 待处理申请:在用户登录后,会获取到需要进行处理的好友的请求
- 好友申请的处理:同意或者拒绝
- 删除好友:对于指定好友关系进行删除
- 用户搜索:搜索指定的用户,获取相关的信息
- 聊天会话列表获取:登录成功后获取到当前你所处于的单聊或者群聊的聊天
- 群聊的创建:根据选择的用户ID信息,创建出会话的群聊功能
- 聊天成员的获取:在群聊中获取成员列表
模块划分
- 参数解析模块
- 日志模块
- 服务注册模块
- 数据库数据成员操作模块
- 同意好友申请,插入一个单聊会话到数据库中
- 从数据库根据指定用户ID获取好友ID
- 创建群聊的时候要向数据库中插入群聊的信息
- 根据用户ID获取会话的信息
- 删除好友的时候要删除的是两人的好友关系,单聊会话以及会话成员的信息
- RPC调用
- ElasticSearch搜索
网关服务
网关服务其实没什么好说的,主要就是把前面的功能都缝合在了一起,不过值得注意的是WebSocket的用法,具体看代码吧
功能设计
网关服务器在设计中,最重要的两个功能:
- 作为入口服务器接收客户端的所有请求,进行请求的子服务分发,得到响应后进行响应
- 对客户端进行事件通知(好友申请和处理及删除,单聊/群聊会话创建,新消息)
基于以上的两个功能,因此网关服务器包含两项通信:
- HTTP 通信:进行业务处理
- WEBSOCKET 通信:进行事件通知
模块划分
- 参数/配置文件解析模块:基于 gflags 框架直接使用进行参数/配置文件解析。
- 日志模块:基于 spdlog 框架封装的模块直接使用进行日志输出。
- rpc 服务发现与调用模块:基于 etcd 框架与 brpc 框架封装的服务发现与调用模块
- 因为要分发处理所有请求,因此所有的子服务都需要进行服务发现。
- redis 客户端模块:基于 redis++封装的客户端进行内存数据库数据操作
- 根据用户子服务添加的会话信息进行用户连接身份识别与鉴权
- HTTP 通信服务器模块:基于 cpp-httplib 库搭建 HTTP 服务器,接收 HTTP 请求进行业务处理。
- WEBSOCKET 服务器模块:基于 Websocketpp 库,搭建 websocket 服务器,进行事件通知。
- 客户端长连接管理模块:建议用户 ID 与长连接句柄映射关系,便于后续根据用户 ID 找到连接进行事件通知
接口实现流程
- 用户名注册
- 用户名登录
- 短信验证码获取
- 手机号码注册
- 手机号码登录
- 用户信息获取
- 修改用户头像
- 修改用户签名
- 修改用户昵称
- 修改用户绑定手机号
- 获取好友列表
- 发送好友申请
- 获取待处理好友申请
- 好友申请处理
- 删除好友
- 搜索用户
- 获取用户聊天会话列表
- 创建多人聊天会话
- 获取消息会话成员列表
- 发送新消息
- 获取指定时间段消息列表
- 获取最近 N 条消息列表
- 搜索关键字历史消息
- 单个文件数据获取
- 多个文件数据获取
- 单个文件数据上传
- 多个文件数据上传
- 语音转文字