# 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 # 仿微信的即时通讯聊天系统 (服务端)
wechat.png
# 一、项目介绍 这是一个仿微信的服务端聊天室项目,该项目在设计的时候采用微服务框架设计,将一个大的业务拆分称为多个子业务,分别在多台不同的机器节点上提供对应的服务,由网关服务统一接收多个客户端的各种不同请求,然后将请求分发到不同的子服务节点上进行处理,获取响应后再转发给客户端。 # 二、服务介绍 - **网关服务**器:提供与客户端进行直接交互的作用,用于接收客户端的各项不同的请求,进行用户鉴权通过后,将请求分发到各个不同的子服务进行处理,接收到响应后,发送给客户端。 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**:项目工程的一键式部署工具。 # 四、后台服务技术框架图 - **项目整体结构**
项目整体结构.png
- **语音转换子服务通信流程**
语音识别子服务.png
- **文件管理子服务**
文件管理子服务.png