整体架构流程

客户端 → Nginx(负载均衡)→ ChatServer集群 → Redis(消息队列)→ 其他ChatServer → MySQL(数据持久化)

数据流向

  • 用户注册/登录 → MySQL

  • 在线消息 → Redis发布/订阅 → 目标服务器

  • 离线消息 → MySQL → 用户登录时推送

  • 好友/群组关系 → MySQL

技术栈

  • Json序列化和反序列化

  • muduo网络库开发

  • nginx源码编译安装和环境部署

  • nginx的tcp负载均衡器配置

  • redis缓存服务器编程实践

  • 基于发布-订阅的服务器中间件redis消息队列编程实践

  • MySQL数据库编程

  • CMake构建编译环境

  • Github托管项目

项目需求

  1. 客户端新用户注册

  2. 客户端用户登录

  3. 添加好友和添加群组

  4. 好友聊天

  5. 群组聊天

  6. 离线消息

  7. nginx配置tcp负载均衡

  8. 集群聊天系统支持客户端跨服务器通信

项目目标

  1. 掌握服务器的网络I/O模块,业务模块,数据模块分层的设计思想

  2. 掌握c++ muduo网络库的编程以及实现原理

  3. 掌握Json的编程应用

  4. 掌握nginx配置部署tcp负载均衡器的应用以及原理

  5. 掌握服务器中间件的应用场景和基于发布-订阅的redis编程实践以及应用原理

  6. 掌握CMake构建自动化编译环境

  7. 掌握Github管理项目

开发环境

  1. ubuntu linux环境

  2. 安装Json开发库

  3. 安装boost + muduo网络库开发环境

  4. 安装redis环境

  5. 安装mysql数据库环境

  6. 安装nginx

  7. 安装CMake环境

Muduo 网络库完整搭建教程(Linux 环境)


Muduo 是基于 Reactor 模式的 Linux 专属 C++ 网络库,搭建核心是安装依赖→编译源码→验证安装,以下是 Ubuntu/CentOS 通用步骤,包含环境配置、编译细节、验证测试和常见问题解决。

一、搭建前提


操作系统:Linux(推荐 Ubuntu 18.04+/CentOS 7+,muduo 依赖 epoll,不支持 Windows/macOS);
核心依赖:C++ 编译器(gcc 4.8+)、CMake(3.0+)、Boost 库(1.58+)、Git(拉取源码)。

二、分步搭建流程

步骤 1:安装基础编译工具与依赖

# 更新软件源
sudo apt update
 
# 安装基础编译工具(gcc/g++/make/cmake)
sudo apt install -y build-essential cmake
 
# 安装 Boost 库(muduo 依赖 boost-thread/boost-system)
sudo apt install -y libboost-dev libboost-thread-dev
 
# 安装 Git(拉取源码)
sudo apt install -y git

步骤 2:拉取 Muduo 源码

# 克隆官方仓库(若网络慢,可换国内镜像,如 gitee 镜像)
git clone https://github.com/chenshuo/muduo.git
 
# 进入源码目录
cd muduo


 

步骤 3:编译 Muduo 源码
Muduo 采用 CMake 构建,编译前需创建构建目录,避免污染源码:

# 创建 build 目录(规范编译目录)
mkdir build && cd build
 
# 配置 CMake(指定安装路径为 /usr/local,方便系统查找)
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
 
# 编译(-j 后接线程数,建议等于 CPU 核心数,加速编译)
# 例如 4 线程:make -j4
make -j$(nproc)


步骤 4:安装 Muduo 库(关键)
编译完成后,将库文件和头文件安装到系统目录(/usr/local),方便后续项目链接:

sudo make install
 

步骤 5:验证安装是否成功
安装后会生成两类文件,检查是否存在即可确认:

# 检查头文件(muduo 核心头文件)
ls /usr/local/include/muduo/
 
# 检查库文件(静态库,muduo_base 基础库 + muduo_net 网络库)
ls /usr/local/lib/libmuduo_*.a


正常输出应包含:

头文件:muduo/base/、muduo/net/ 等目录;
库文件:libmuduo_base.a、libmuduo_net.a。

json

一、JSON 是什么?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它采用纯文本格式,结构清晰、易于阅读和编写,也易于机器解析和生成。在 C++ 项目中,常用于:

  • 数据序列化:将对象或数据结构转换为字符串,便于网络传输或存储。

  • 数据反序列化:将接收到的 JSON 字符串还原为程序中的对象或数据结构。


二、为什么在项目中使用 JSON?

在这个集群聊天服务器项目中,JSON 用于:

  1. 客户端与服务器之间的通信协议(如登录、注册、发送消息等)

  2. 存储和传输离线消息

  3. 配置信息存储

  4. 日志结构化输出

它比 XML 更轻量,比纯二进制协议更易调试。


三、JSON 的基本结构

JSON 支持以下几种数据类型:

json

{
  "name": "张三",
  "age": 25,
  "isStudent": false,
  "hobbies": ["编程", "读书", "音乐"],
  "address": {
    "city": "北京",
    "zip": "100000"
  }
}
  • 对象:{ key: value }

  • 数组:[ value1, value2 ]

  • 字符串:"string"

  • 数字:123 或 12.34

  • 布尔值:true / false

  • 空值:null


四、项目中使用的 JSON 库

项目使用的是 JSON for Modern C++(作者:nlohmann),特点是:

  • 只有一个头文件 json.hpp

  • 支持 C++11 及以上

  • 语法直观,类似操作 STL 容器

  • 支持序列化/反序列化 STL 容器


五、项目中 JSON 的使用示例

1. 序列化(对象 → JSON 字符串)

#include "json.hpp"
using json = nlohmann::json;

json js;
js["id"] = 123;
js["name"] = "张三";
js["msg"]["zhang san"] = "hello world";

std::string jsonStr = js.dump(); // 序列化为字符串

2. 反序列化(JSON 字符串 → 对象)

std::string receivedStr = R"({"id":123,"name":"张三"})";
json js = json::parse(receivedStr);

int id = js["id"];
std::string name = js["name"];

3. 直接序列化 STL 容器

std::vector<int> vec = {1, 2, 3, 4};
json js;
js["list"] = vec;

std::map<int, std::string> m = {{1, "黄山"}, {2, "华山"}};
js["path"] = m;

六、JSON 在聊天服务器中的典型应用场景

假设你要发送一条聊天消息:

// 构造消息对象
json msg;
msg["msgid"] = 1; // 消息类型:聊天
msg["id"] = 1001;
msg["name"] = "张三";
msg["to"] = 1002;
msg["msg"] = "你好,李四!";
msg["time"] = "2023-10-01 12:00:00";

// 序列化并发送
std::string sendStr = msg.dump();
send(conn, sendStr.c_str(), sendStr.size(), 0);

服务器收到后解析:

std::string recvStr = receive(conn);
json recvMsg = json::parse(recvStr);

int msgid = recvMsg["msgid"];
std::string content = recvMsg["msg"];
// 处理消息...

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐