nginx集群聊天室(一) 初步讲解集群聊天室所需库的搭建
整体架构流程
客户端 → Nginx(负载均衡)→ ChatServer集群 → Redis(消息队列)→ 其他ChatServer → MySQL(数据持久化)
数据流向
-
用户注册/登录 → MySQL
-
在线消息 → Redis发布/订阅 → 目标服务器
-
离线消息 → MySQL → 用户登录时推送
-
好友/群组关系 → MySQL
技术栈
-
Json序列化和反序列化
-
muduo网络库开发
-
nginx源码编译安装和环境部署
-
nginx的tcp负载均衡器配置
-
redis缓存服务器编程实践
-
基于发布-订阅的服务器中间件redis消息队列编程实践
-
MySQL数据库编程
-
CMake构建编译环境
-
Github托管项目
项目需求
-
客户端新用户注册
-
客户端用户登录
-
添加好友和添加群组
-
好友聊天
-
群组聊天
-
离线消息
-
nginx配置tcp负载均衡
-
集群聊天系统支持客户端跨服务器通信
项目目标
-
掌握服务器的网络I/O模块,业务模块,数据模块分层的设计思想
-
掌握c++ muduo网络库的编程以及实现原理
-
掌握Json的编程应用
-
掌握nginx配置部署tcp负载均衡器的应用以及原理
-
掌握服务器中间件的应用场景和基于发布-订阅的redis编程实践以及应用原理
-
掌握CMake构建自动化编译环境
-
掌握Github管理项目
开发环境
-
ubuntu linux环境
-
安装Json开发库
-
安装boost + muduo网络库开发环境
-
安装redis环境
-
安装mysql数据库环境
-
安装nginx
-
安装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 用于:
-
客户端与服务器之间的通信协议(如登录、注册、发送消息等)
-
存储和传输离线消息
-
配置信息存储
-
日志结构化输出
它比 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"];
// 处理消息...
更多推荐



所有评论(0)