C++ 实现的集群聊天服务器,支持多服务器负载均衡与跨服务器通信。
本项目基于:
- 网络库:muduo
- 序列化:nlohmann/json
- 消息队列/跨服转发:Redis
- 数据库:MySQL
- 负载均衡:nginx
- 构建工具:CMake
当前仓库已经补齐:
- CMake 依赖检测与链接配置
- 客户端/服务端输出文件名与 README 一致
example/muduo_client.cc- 示例
makefile - 缺失的标准头文件
.gitignore已覆盖构建产物、Python 虚拟环境与本地临时文件admin_service已具备基础管理接口骨架
当前版本新增:
- 统一配置文件:
config/server.conf - 数据库迁移脚本:
db/migrations/ - 消息历史、已读/撤回基础字段
- 统一 ACK 结构、协议
version与request_id - 统一错误码常量,服务端/客户端/验证脚本使用同一套编号
- 离线消息条数限制,可配置保留最近 N 条
- 聊天消息基于
request_id做幂等,避免重复投递 - 服务启动/退出时会恢复在线用户状态,降低异常退出残留影响
- 群组操作补充权限边界校验,避免非法创建群或修改群主角色
- 支持私聊/群聊历史消息分页查询
- 支持私聊/群聊历史消息按时间升序或降序查询
- 支持搜索用户、黑名单增删与黑名单拦截发消息/加好友
- 支持用户在
online和busy间切换,查询和搜索结果会反映忙碌状态 - 支持已登录用户修改昵称,用户详情、搜索和会话展示会读取新昵称
- 支持头像上传与静态访问,桌面端可预览并上传头像到后端
- 群组权限校验、退群、角色调整
- 群主可授予或回收管理员,管理员可将非群主成员降为普通成员
- 支持群公告、成员禁言、踢人等群管理闭环
- bcrypt 密码哈希与迁移脚本
- 管理后台审计/封禁接口
- Prometheus
/metrics - AI mock 能力:敏感词审核、机器人回复、聊天摘要
- Docker Compose / Prometheus / Grafana 部署骨架
ClusterChatServer/
├── CMakeLists.txt
├── README.md
├── admin_service/ # Python FastAPI 管理后台骨架
├── example/
│ ├── makefile
│ ├── muduo_Server.cc
│ ├── muduo_client.cc
│ └── testJson.cc
├── include/
├── src/
├── test/
└── thirdparty/
└── json.hpp
sudo apt update
sudo apt install -y \
build-essential cmake g++ git \
libboost-dev \
libhiredis-dev \
default-libmysqlclient-dev \
mysql-server \
redis-server \
nginx如果 apt 下载很慢或失败,可以切换到清华等国内镜像源后再执行以上命令。
Ubuntu 24.04 默认通常使用:
/etc/apt/sources.list.d/ubuntu.sources
先备份原配置:
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak写入清华源(普通仓库走清华,安全更新走官方源,较稳妥):
sudo tee /etc/apt/sources.list.d/ubuntu.sources > /dev/null <<'EOF'
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: https://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF更新索引:
sudo apt update如果你想连 security 也切到清华,可以改成:
sudo tee /etc/apt/sources.list.d/ubuntu.sources > /dev/null <<'EOF'
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
Suites: noble noble-updates noble-backports noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF恢复官方源:
sudo mv /etc/apt/sources.list.d/ubuntu.sources.bak /etc/apt/sources.list.d/ubuntu.sources
sudo apt updateUbuntu 24.04 的默认软件源里通常没有现成的 muduo 开发包,需要单独下载源码编译。
cd /tmp
git clone https://github.com/chenshuo/muduo.git
cd muduo
# Ubuntu 24.04 / GCC 13 下如遇 muduo 因 Werror 报错,可先去掉 CMakeLists.txt 里的 -Werror
./build.sh
./build.sh install./build.sh install 默认会把 muduo 安装到类似下面的目录:
/tmp/release-install-cpp11
如果你想把 muduo 安装到系统目录,也可以手动拷贝:
sudo cp -r /tmp/release-install-cpp11/include/muduo /usr/local/include/
sudo cp -d /tmp/release-install-cpp11/lib/libmuduo_*.so* /usr/local/lib/
sudo ldconfig如果不拷贝到 /usr/local,构建本项目时请显式指定 muduo 安装前缀:
cmake -S . -B build -DMUDUO_ROOT=/tmp/release-install-cpp11sudo systemctl enable --now mysql
sudo systemctl enable --now redis-server
sudo systemctl enable --now nginx本项目服务端最终会链接以下库:
muduo_netmuduo_basemysqlclient(或mariadb兼容库)hiredispthread
头文件依赖主要包括:
muduo/net/TcpServer.hmuduo/net/TcpClient.hmuduo/net/EventLoop.hmysql/mysql.hhiredis/hiredis.hthirdparty/json.hpp
数据库连接配置默认从以下文件读取:
config/server.conf
默认配置:
- MySQL 地址:
127.0.0.1 - 用户名:
root - 密码:
123456 - 数据库:
chat
如果你的本机配置不同,请先修改该配置文件。
./bin/chat_server --config config/server.conf
./bin/chat_server --config config/server.conf 127.0.0.1 9120仓库根目录已提供初始化脚本:
mysql -uroot -p < chat.sql已有数据库升级可按顺序执行:
mysql -uroot -p chat < db/migrations/001_constraints_and_indexes.sql
mysql -uroot -p chat < db/migrations/002_message_history_and_admin_tables.sql
mysql -uroot -p chat < db/migrations/003_password_hashing_prep.sql
mysql -uroot -p chat < db/migrations/004_user_blacklist.sql
mysql -uroot -p chat < db/migrations/005_group_moderation_features.sql
mysql -uroot -p chat < db/migrations/006_user_avatar.sql如果在 Ubuntu 上执行时出现:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
通常是因为 Ubuntu 默认把 MySQL root 配置成了 auth_socket 认证,而不是密码登录。
此时可以直接使用:
sudo mysql < chat.sql如果你希望继续使用 mysql -uroot -p,可以先执行:
sudo mysql进入 MySQL 后查看认证方式:
SELECT user, host, plugin FROM mysql.user;如果 root@localhost 使用的是 auth_socket,可以改成密码认证:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';
FLUSH PRIVILEGES;退出后再执行:
mysql -uroot -p < chat.sql更推荐的做法是单独创建项目用户,而不是直接修改 root:
sudo mysqlCREATE DATABASE IF NOT EXISTS chat;
CREATE USER 'chatuser'@'localhost' IDENTIFIED BY 'chatpass';
GRANT ALL PRIVILEGES ON chat.* TO 'chatuser'@'localhost';
FLUSH PRIVILEGES;然后导入:
mysql -uchatuser -p chat < chat.sql如果使用项目用户,记得同步修改:
config/server.conf
中的数据库用户名和密码。
密码哈希一次性迁移脚本:
python3 scripts/migrate_passwords.py --user root --database chat回滚建议见:
db/MIGRATIONS.md
cmake -S . -B build
cmake --build build -jcmake -S . -B build -DMUDUO_ROOT=/tmp/release-install-cpp11
cmake --build build -j如果 MySQL/hiredis 也是下载后解压到自定义目录,而不是系统安装,可继续追加:
cmake -S . -B build \
-DMUDUO_ROOT=/tmp/release-install-cpp11 \
-DMYSQL_ROOT=/你的/mysql前缀 \
-DHIREDIS_ROOT=/你的/hiredis前缀
cmake --build build -j编译完成后可执行文件输出到:
bin/chat_server
bin/chat_client
仓库还提供了一个独立的 Python FastAPI 管理后台骨架:
admin_service/
它不替代当前 C++ 聊天服务,而是作为辅助管理与查询模块使用,适合后续做:
- 用户查询
- 好友关系查询
- 群组查询
- 离线消息查询
- 健康检查
- 后续扩展为管理后台 / 运营后台 / 审计接口
admin_service/
├── README.md
├── requirements.txt
├── .env.example
└── app/
├── main.py
├── core/
├── db/
├── models/
├── routers/
└── schemas/
cd admin_service
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtcd admin_service
cp .env.example .env默认示例:
APP_NAME=ClusterChat Admin Service
APP_HOST=127.0.0.1
APP_PORT=8010
DEBUG=true
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=123456
MYSQL_DATABASE=chat
ADMIN_TOKEN=change-me
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
MODERATION_SENSITIVE_WORDS=spam,ad,scamcd /home/xh/ClusterChatServer
source admin_service/.venv/bin/activate
uvicorn admin_service.app.main:app --reload --host 127.0.0.1 --port 8010GET /GET /healthGET /health/dbGET /metricsGET /api/v1/users(state=online|offline|banned)GET /api/v1/users/{user_id}GET /api/v1/friendsGET /api/v1/groupsGET /api/v1/offline-messagesGET /api/v1/historyPOST /api/v1/admin/users/{user_id}/banPOST /api/v1/admin/users/{user_id}/unbanGET /api/v1/admin/audit-logsGET /api/v1/admin/operation-logsPOST /api/v1/ai/moderatePOST /api/v1/ai/chatbotPOST /api/v1/ai/summary
- 当前
admin_service是骨架版本,重点在于提供可扩展结构 - 推荐从仓库根目录启动,而不是进入
admin_service/app子目录启动 - 如果 VS Code / Pylance 提示找不到
sqlalchemy、fastapi等模块,通常是因为:- 还没有安装
requirements.txt - 或 VS Code 没切换到
admin_service/.venv解释器
- 还没有安装
建议在 VS Code 中选择:
Python: Select Interpreter -> admin_service/.venv/bin/python
管理员接口需要请求头:
X-Admin-Token: <ADMIN_TOKEN>
./bin/chat_server --config config/server.conf 127.0.0.1 9120再开一个终端启动第二个实例:
./bin/chat_server --config config/server.conf 127.0.0.1 9121Ubuntu 24.04 默认的 /etc/nginx/nginx.conf 中:
http {
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}也就是说 /etc/nginx/conf.d/*.conf 是在 http {} 中加载的,不能直接把 stream {} 写进 conf.d,否则会报:
"stream" directive is not allowed here
因此建议按下面步骤配置。
sudo apt update
sudo apt install -y nginx libnginx-mod-streamsudo mkdir -p /etc/nginx/stream-conf.d执行:
sudo vim /etc/nginx/nginx.conf在 events { ... } 后、http { ... } 前加入:
include /etc/nginx/stream-conf.d/*.conf;修改后大致如下:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
include /etc/nginx/stream-conf.d/*.conf;
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}执行:
sudo vim /etc/nginx/stream-conf.d/chat.conf写入:
stream {
upstream chat_servers {
server 127.0.0.1:9120 weight=1;
server 127.0.0.1:9121 weight=1;
}
server {
listen 8000;
proxy_pass chat_servers;
proxy_connect_timeout 5s;
proxy_timeout 1h;
}
}sudo nginx -t如果输出类似:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
说明配置正确。
sudo nginx -t
sudo systemctl reload nginx如果 nginx 尚未启动:
sudo systemctl enable --now nginx./bin/chat_server --config config/server.conf 127.0.0.1 9120
./bin/chat_server --config config/server.conf 127.0.0.1 9121./bin/chat_client 127.0.0.1 8000如果不走 nginx,也可以直接连某台服务端:
./bin/chat_client 127.0.0.1 9120一键启动:
docker compose up --build -d或:
bash scripts/run_stack.sh默认暴露端口:
- chat_server:
9120 - nginx stream:
8000 - admin_service:
8010 - Prometheus:
9090 - Grafana:
3000
cmake -S . -B build -DBUILD_TESTS=ON
cmake --build build -j --target cluster_chat_unit
./build/cluster_chat_unitcd /home/xh/ClusterChatServer
source admin_service/.venv/bin/activate
pytest tests/integration/test_admin_service.py -qbash scripts/check_admin_service.sh
bash scripts/check_admin_metrics.sh
python3 scripts/check_server_roundtrip.pycd example
make生成:
muduo_servermuduo_clienttestJson
如果 muduo 不在 /usr/local,可以这样编译:
make MUDUO_PREFIX=/tmp/release-install-cpp11
# 如果系统没有安装 boost 头文件,可额外指定 boost 头文件目录
make MUDUO_PREFIX=/tmp/release-install-cpp11 BOOST_INC=/usr/include先启动服务端:
cd example
./muduo_server再启动客户端:
cd example
./muduo_client 127.0.0.1 9120输入任意文本后回车即可看到服务端回显;输入 quit 退出。
说明 muduo 没安装,或者没被 CMake 找到。
优先检查:
ls /usr/local/include/muduo/net/TcpServer.h
ls /usr/local/lib/libmuduo_net.so如果 muduo 安装在自定义目录,使用:
cmake -S . -B build -DMUDUO_ROOT=/你的/muduo/安装目录安装:
sudo apt install -y default-libmysqlclient-dev安装:
sudo apt install -y libhiredis-dev通常不是网络问题,而是:
- MySQL 没启动
chat数据库/表没创建config/server.conf里的数据库用户名密码不对