# WeChatServer
**Repository Path**: quilling/we-chat-server
## Basic Information
- **Project Name**: WeChatServer
- **Description**: 这是一个仿微信的客户端聊天室项目。(服务端)
- **Primary Language**: C++
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2024-09-17
- **Last Updated**: 2025-04-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 仿微信的即时通讯聊天系统 (服务端)
# 一、项目介绍
这是一个仿微信的服务端聊天室项目,该项目在设计的时候采用微服务框架设计,将一个大的业务拆分称为多个子业务,分别在多台不同的机器节点上提供对应的服务,由网关服务统一接收多个客户端的各种不同请求,然后将请求分发到不同的子服务节点上进行处理,获取响应后再转发给客户端。
# 二、服务介绍
- **网关服务**器:提供与客户端进行直接交互的作用,用于接收客户端的各项不同的请求,进行用户鉴权通过后,将请求分发到各个不同的子服务进行处理,接收到响应后,发送给客户端。
1. 用户鉴权:客户端在登录成功后,后台会为客户端创建登录会话,并向客户端返回一个登录会话 ID,往后,客户端发送的所有请求中都必须带有对应的会话 ID 进行身份识别,否则视为未登录,不予提供除注册/登录/验证码获取以外的所有服务。
在网关服务中,基于不同的使用目的,向客户端提供两种不同的通信:
> - **HTTP通信**:在项目的设计中客户端的大部分业务都是基于请求-响应模式进行的,因此基于便于扩展,设计简单的目的,采用 HTTP 协议作为与客户端进行基础的业务请求的通信协议,在 HTTP 通信中涵盖了上述所有的功能接口请求。
>
> - **WebSocket通信**:在聊天室项目中,不仅仅包含客户端主动请求的业务,还包含了一些需要服务器主动推送的通知,因为 HTTP 不支持服务器主动推送数据,因此采用 `Websocket` 协议进行长连接的通信,向客户端发送通知类型的数据。
>
> - 好友申请的通知
>
> - 好友申请处理结果的通知
>
> - 好友删除的通知
>
> - 聊天会话建立的通知
>
> - 聊天新消息的通知
- **用户管理服务器** :主要用于管理用户的数据,以及关于用户信息的各项操作,因此在上述项目功能中,用户子服务需要提供以下接口:
1. 用户注册:用户输入用户名(昵称),以及密码进行用户名的注册
2. 用户登录:用户通过用户名和密码进行登录
3. 短信验证码获取:当用户通过手机号注册或登录的时候,需要获取短信验证码
4. 手机号注册:用户输入手机号和短信验证码进行手机号的用户注册
5. 手机号登录:用户输入手机号和短信验证码进行手机号的用户登录
6. 用户信息获取:当用户登录之后,获取个人信息进行展示
7. 头像修改:设置用户头像
8. 昵称修改:设置用户昵称
9. 签名修改:设置用户签名
10. 手机号修改:修改用户的绑定手机号
- **好友管理服务器**:主要用于管理好友相关的数据与操作,因此主要负责以下接口:
1. 好友列表的获取:当用户登录成功之后,获取自己好友列表进行展示
2. 申请好友:搜索用户之后,点击申请好友,向对方发送好友申请
3. 待处理申请的获取:当用户登录成功之后,会获取离线的好友申请请求以待处理
4. 好友申请的处理:针对收到的好友申请进行同意/拒绝的处理
5. 删除好友:删除当前好友列表中的好友
6. 用户搜索:可以进行用户的搜索用于申请好友
7. 聊天会话列表的获取:每个单人/多人聊天都有一个聊天会话,在登录成功后可以获取聊天会话,查看历史的消息以及对方的各项信息
8. 多人聊天会话的创建:单人聊天会话在对方同意好友时创建,而多人会话需要调用该接口进行手动创建
9. 聊天成员列表的获取:多人聊天会话中,可以点击查看群成员按钮,查看群成员信息
- **文件管理服务器**:主要用于管理用户的头像,以及消息中的文件存储,因此需要提供以下接口:
1. 文件的上传
a. 单个文件的上传:这个接口基本用于后台部分,收到文件消息后将文件数据,转发给文件子服务进行存储
b. 多个文件的上传:这个接口基本用于后台部分,收到文件消息后将文件数据,转发给文件子服务进行存储
2.文件的下载
a. 单个文件的下载:在后台用于获取用户头像文件数据,以及客户端用于获取文件/语音/ 图片消息的文件数据
b. 多个文件的下载:在后台用于大批量获取用户头像数据(比如获取用户列表的时候),以及前端的批量文件下载
- **消息管理服务器**:消息管理子服务,主要用于管理消息元信息的存储,因此需要提供以下接口:
1. 获取历史消息:
a. 获取最近 N 条消息:用于登录成功后,点击对方头像打开聊天框时显示最近的消息
b. 获取指定时间段内的消息:用户可以进行聊天消息的按时间搜索
2. 消息搜索:用户可以进行聊天消息的关键字搜索
- **消息路由服务器**:主要用于针对一条消息内容,组织消息的 ID 以及各项所需要素,然后告诉网关服务器一条消息应该发给谁。通常消息都是以聊天会话为基础进行发送的,根据会话找到它的所有成员,这就是转发的目标。除此之外,转发子服务将收到的消息,放入消息队列中,由文件子服务/消息子服务进行消费存储
1. 获取消息转发目标:针对消息内容,组织消息,并告知网关转发目标。
- **语音转换服务器**:用于调用语音识别 SDK,进行语音识别,将语音转为文字后返回给网关。
1. 语音消息的文字转换:客户端进行语音消息的文字转换。
# 三、组件依赖
项目所使用到的框架/库:
- **gflags**:针对程序运行所需的运行参数解析/配置文件解析框架。
- **gtest**:针对程序编写到一定阶段后,进行的单元测试框架。
- **spdlog**:针对项目中进行日志输出的框架。
- **protobuf**:针对项目中的网络通信数据所采用的序列化和反序列化框架。
- **brpc**:项目中的 rpc 调用使用的框架。
- **redis**:高性能键值存储系统,用于项目中进行用户登录会话信息的存储管理。
- **mysql**:关系型数据库系统,用于项目中的业务数据的存储管理。
- **ODB**:项目中 `mysql` 数据库操作的 ORM 框架(Object-Relational Mapping,对象关系映射)
- **Etcd**:分布式、高可用的一致性键值存储系统,用于项目中实现服务注册与发现功能的框架。
- **Boost.beast**:用于搭建高性能的`HTTP` 和`Websocket`服务器的框架。
- **rabbitMQ**:用于搭建消息队列服务器,用于项目中持久化消息的转发消费。
- **elasticsearch**:用于搭建文档存储/搜索服务器,用于项目中历史消息的存储管理
- **语音云平台**:采用百度语音识别技术云平台实现语音转文字功能。
- **短信云平台**:采用阿里云短信云平台实现手机短信验证码通知功能。
- **cmake**:项目工程的构建工具。
- **docker**:项目工程的一键式部署工具。
# 四、后台服务技术框架图
- **项目整体结构**
- **语音转换子服务通信流程**
- **文件管理子服务**