主要包含以下功能:
(1)用户注册:用户输入用户名以及密码进行用户名的注册
(2)用户登录:用户通过用户名和密码进行登录
(3)短信验证码获取:当用户通过手机号注册或登录的时候,需要获取短信验证码
(4)手机号注册:用户输入手机号和短信验证码进行用户注册
(5)手机号登录:用户输入手机号和短信验证码进行用户登录
(6)用户信息获取:当用户登录之后,获取个人信息进行展示
(7)头像修改:设置用户头像
(8)昵称修改:设置用户昵称
(9)签名修改:设置用户签名
(10)手机号修改:修改用户的绑定手机号
(11)好友列表的获取:当用户登录成功之后,获取自己好友列表进行展示
(12)申请好友:搜索用户之后,点击申请好友,向对方发送好友申请
(13)待处理申请的获取:当用户登录成功之后,会获取离线的好友申请请求以待处理
(14)好友申请的处理:针对收到的好友申请进行同意/拒绝的处理
(15)删除好友:删除当前好友列表中的好友
(16)用户搜索:可以进行用户的搜索用于申请好友
(17)聊天会话列表的获取:每个单人/多人聊天都有一个聊天会话,在登录成功后可以获取聊天会话,查看历史的消息以及对方的各项信息
(18)多人聊天会话的创建:单人聊天会话在对方同意好友时创建,而多人会话需要调用该接口进行手动创建
(19)聊天成员列表的获取:多人聊天会话中,可以点击查看群成员按钮,查看群成员信息
(20)发送聊天消息:在聊天框输入内容后点击发送,则向服务器发送消息聊天请求
(21)获取历史消息:
a. 获取最近 N 条消息:用于登录成功后,点击对方头像打开聊天框时显示最近的消息
b. 获取指定时间段内的消息:用户可以进行聊天消息的按时间搜索
(22)消息搜索:用户可以进行聊天消息的关键字搜索
(23)文件上传:
a. 单个文件的上传:这个接口基本用于后台部分,收到文件消息后将文件数据转发给文件子服务进行存储
b. 多个文件的上传:这个接口基本用于后台部分,收到文件消息后将文件数据转发给文件子服务进行存储
(24)文件下载:
a. 单个文件的下载:在后台用于获取用户头像文件数据,以及客户端用于获取文件/语音/图片消息的文件数据
b. 多个文件的下载:在后台用于大批量获取用户头像数据(比如获取用户列表的时候),以及前端的批量文件下载
(25)语音消息的文字转换:客户端进行语音消息的文字转换
除了以上的与客户端之间交互的功能之外,还包含一些服务器后台内部所需的功能:
-
消息的存储:用于将文本消息进行存储起来,以便于进行消息的搜索,以及离线消息的存储。
-
文件的存储:用于存储用户的头像文件,以及消息中的文件/图片/语音文件数据。
-
各项用户,好友,会话数据的存储管理
II. 框架与微服务拆分设计
该项目在设计的时候采用 微服务框架设计,指将一个大的业务拆分称为多个子业务,分别在多台不同的机器节点上提供对应的服务,由网关服务统一接收多个客户端的各种不同请求,然后将请求分发到不同的子服务节点上进行处理,获取响应后,再转发给客户端。
微服务架构设计的思想以及特点主要包括以下几个方面:
-
服务拆分:将应用程序拆分成多个小型服务,每个服务负责一部分业务功能,具有独立的生命周期和部署。
-
独立部署:每个微服务可以独立于其他服务进行部署、更新和扩展。
-
语言和数据的多样性:不同的服务可以使用不同的编程语言和数据库,根据服务的特定需求进行技术选型。
-
轻量级通信:服务之间通过定义良好的
API进行通信,通常使用HTTP/REST、gRPC等协议。 -
去中心化治理:每个服务可以有自己的开发团队,拥有自己的技术栈和开发流程。
-
弹性和可扩展性:微服务架构支持服务的动态扩展和收缩,以适应负载的变化。
-
容错性:设计时考虑到服务可能会失败,通过断路器、重试机制等手段提高系统的容错性。
-
去中心化数据管理:每个服务管理自己的数据库,数据在服务之间是私有的,这有助于保持服务的独立性。
-
自动化部署:通过持续集成和持续部署(
CI/CD)流程自动化服务的构建、测试和部署。 -
监控和日志:对每个服务进行监控和日志记录,以便于跟踪问题和性能瓶颈。
-
服务发现:服务实例可能动态变化,需要服务发现机制来动态地找到服务实例。
-
安全:每个服务需要考虑安全问题,包括认证、授权和数据传输的安全性。
1、网关服务
网关服务,提供与客户端进行直接交互的作用,用于接收客户端的各项不同的请求,进行用户鉴权通过后,将请求分发到各个不同的子服务进行处理,接收到响应后,发送给客户端。
用户鉴权:客户端在登录成功后,后台会为客户端创建登录会话,并向客户端返回一个登录会话
ID,往后,客户端发送的所有请求中都必须带有对应的会话ID进行身份识别,否则视为未登录,不予提供除注册/登录/验证码获取以外的所有服务。
在网关服务中,基于不同的使用目的,向客户端提供两种不同的通信:
-
HTTP通信:在项目的设计中客户端的大部分业务都是基于请求-响应模式进行的,因此基于便于扩展,设计简单的目的,采用HTTP协议作为与客户端进行基础的业务请求的通信协议,在HTTP通信中涵盖了上述所有的功能接口请求。 -
WEBSOCKET通信:在聊天室项目中,不仅仅包含客户端主动请求的业务,还包含了一些需要服务器主动推送的通知,因为HTTP不支持服务器主动推送数据,因此采用Websocket协议进行长连接的通信,向客户端发送通知类型的数据,比如:- 好友申请的通知
- 好友申请处理结果的通知
- 好友删除的通知
- 聊天会话建立的通知
- 聊天新消息的通知
2、用户管理子服务
用户管理子服务,主要用于管理用户的数据,以及关于用户信息的各项操作,因此在上述项目功能中用户子服务需要提供以下接口:
- 用户注册:用户输入用户名(昵称),以及密码进行用户名的注册
- 用户登录:用户通过用户名和密码进行登录
- 短信验证码获取:当用户通过手机号注册或登录的时候,需要获取短信验证码
- 手机号注册:用户输入手机号和短信验证码进行手机号的用户注册
- 手机号登录:用户输入手机号和短信验证码进行手机号的用户登录
- 用户信息获取:当用户登录之后,获取个人信息进行展示
- 头像修改:设置用户头像
- 昵称修改:设置用户昵称
- 签名修改:设置用户签名
- 手机号修改:修改用户的绑定手机号
3、好友管理子服务
好友管理子服务,主要用于管理好友相关的数据与操作,因此主要负责以下接口:
- 好友列表的获取:当用户登录成功之后,获取自己好友列表进行展示
- 申请好友:搜索用户之后,点击申请好友,向对方发送好友申请
- 待处理申请的获取:当用户登录成功之后,会获取离线的好友申请请求以待处理
- 好友申请的处理:针对收到的好友申请进行同意/拒绝的处理
- 删除好友:删除当前好友列表中的好友
- 用户搜索:可以进行用户的搜索用于申请好友
- 聊天会话列表的获取:每个单人/多人聊天都有一个聊天会话,在登录成功后可以获取聊天会话,查看历史的消息以及对方的各项信息
- 多人聊天会话的创建:单人聊天会话在对方同意好友时创建,而多人会话需要调用该接口进行手动创建
- 聊天成员列表的获取:多人聊天会话中,可以点击查看群成员按钮,查看群成员信息
4、文件管理子服务
文件管理子服务,主要用于管理用户的头像,以及消息中的文件存储,因此需要提供以下接口:
- 文件上传:
- 单个文件的上传:这个接口基本用于后台部分,收到文件消息后将文件数据转发给文件子服务进行存储
- 多个文件的上传:这个接口基本用于后台部分,收到文件消息后将文件数据转发给文件子服务进行存储
- 文件下载:
- 单个文件的下载:在后台用于获取用户头像文件数据,以及客户端用于获取文件/语音/图片消息的文件数据
- 多个文件的下载:在后台用于大批量获取用户头像数据(比如获取用户列表的时候),以及前端的批量文件下载
5、消息管理子服务
消息管理子服务,主要用于管理消息元信息的存储,因此需要提供以下接口:
- 获取历史消息:
- 获取 最近 N 条 消息:用于登录成功后,点击对方头像打开聊天框时显示最近的消息
- 获取 指定时间段内 的消息:用户可以进行聊天消息的按时间搜索
- 消息搜索:用户可以进行聊天消息的关键字搜索
6、转发管理子服务
转发子服务,主要用于针对一条消息内容,组织消息的 ID 以及各项所需要素,然后告诉网关服务器一条消息应该发给谁。通常消息都是以聊天会话为基础进行发送的,根据会话找到它的所有成员,这就是转发的目标。
除此之外,转发子服务将收到的消息,放入消息队列中,由【文件子服务】与【消息子服务】进行消费存储。故需要提供以下接口:
- 获取消息转发目标:针对消息内容,组织消息,并告知网关转发目标
7、语音转换子服务
语音转换子服务,用于调用语音识别 SDK,进行语音识别,将语音转为文字后返回给网关。故需要提供以下接口:
- 语音消息的文字转换:客户端进行语音消息的文字转换
后台服务的模块层次图
III. 项目所使用到的框架/库
- gflags:针对程序运行所需的运行参数解析/配置文件解析框架。
- gtest:针对程序编写到一定阶段后,进行的单元测试框架。
- spdlog:针对项目中进行日志输出的框架。
- protobuf:针对项目中的网络通信数据所采用的序列化和反序列化框架。
- brpc:项目中的
rpc调用使用的框架。 - redis:高性能键值存储系统,用于项目中进行用户登录会话信息的存储管理。
- mysql:关系型数据库系统,用于项目中的业务数据的存储管理。
- ODB:项目中
mysql数据库操作的ORM框架(Object-Relational Mapping,对象关系映射) - Etcd:分布式、高可用的一致性键值存储系统,用于项目中实现服务注册与发现功能的框架。
- cpp-httplib:用于搭建简单轻量
HTTP服务器的框架。 - websocketpp:用于搭建
Websocket服务器的框架。 - rabbitMQ:用于搭建消息队列服务器,用于项目中持久化消息的转发消费。
- elasticsearch:用于搭建文档存储/搜索服务器,用于项目中历史消息的存储管理
- 语音云平台:采用百度语音识别技术云平台实现语音转文字功能。
- 短信云平台:采用阿里云短信云平台实现手机短信验证码通知功能。
- cmake:项目工程的构建工具。
- docker:项目工程的一键式部署工具。
IV. 后台服务技术框架图
