一个现代化的C++20跨平台Web服务器,采用主从Reactor模式,使用ASIO实现高性能异步IO,支持PostgreSQL数据库。
- 主从Reactor模式: 主IO Context负责Accept,IO Context Pool负责业务处理
- Session管理: 每个连接独立Session,完整生命周期管理
- 模块化设计: 头文件+实现文件分离,高度解耦
- 跨平台支持: 跨平台
- ✅ C++20标准: concepts, ranges, coroutines等现代特性
- ✅ Boost.ASIO: 高性能异步网络库
- ✅ IO Context Pool: 多IO上下文Round-Robin分配
- ✅ PostgreSQL: 企业级数据库支持
- ✅ 线程池: 高效CPU密集型任务处理
- ✅ 完整测试: Boost.Test单元测试 + Benchmark性能测试
- ✅ 优雅关闭: 完善的资源清理机制
- 多IO Context充分利用多核CPU
- Round-Robin负载均衡
- Keep-Alive长连接支持
- 高并发连接处理
- 低延迟响应
web_server2/
├── CMakeLists.txt # 根CMake配置
├── config.ini # 服务器配置文件
├── config.ini.example # 配置模板
├── README.md # 项目说明
├── QUICKSTART.md # 快速开始指南
├── fronted/ # 前端静态资源
│ ├── index.html
│ ├── images/
│ └── video/
├── src/ # 源代码目录
│ ├── CMakeLists.txt
│ ├── main.cpp # 程序入口
│ ├── database/ # 数据库模块
│ │ ├── postgre_pool.hpp
│ │ └── postgre_pool.cpp
│ ├── http/ # HTTP处理模块
│ │ ├── HttpConnection.hpp
│ │ ├── HttpConnection.cpp
│ │ ├── HttpRequest.hpp
│ │ ├── HttpRequest.cpp
│ │ ├── HttpResponse.hpp
│ │ └── HttpResponse.cpp
│ ├── server/ # 服务器核心
│ │ ├── Session.hpp
│ │ ├── Session.cpp
│ │ ├── WebServer.hpp
│ │ └── WebServer.cpp
│ └── tests/ # 测试目录
│ ├── benchmark.cpp # 性能基准测试
│ ├── test_buffer.cpp
│ ├── test_http.cpp # HTTP测试
│ └── test_threadpool.cpp # 线程池测试
└── build/ # 编译输出目录
└── run/ # 运行目录
Client Connections
↓
┌─────────────────────┐
│ Main Acceptor │ ← 主IO Context(只负责Accept)
│ (io_context) │
└─────────┬───────────┘
│
├─→ Round-Robin分配
↓
┌─────────────────────┐
│ IoContextPool │
│ ┌────┐ ┌────┐ │
│ │IO 1│ │IO 2│ ... │ ← 从IO Contexts(业务处理)
│ └────┘ └────┘ │ 每个运行在独立线程
└─────────┬───────────┘
│
├─→ Session创建
↓
┌─────────────────────┐
│ Session (per conn) │
│ ├─ Buffer │
│ ├─ HttpRequest │
│ ├─ HttpResponse │
│ └─ Timer │
└─────────────────────┘
│
├─→ CPU密集任务
↓
┌─────────────────────┐
│ ThreadPool │ ← 业务线程池
└─────────────────────┘
│
├─→ 数据库操作
↓
┌─────────────────────┐
│ PostgreSQLPool │ ← 数据库连接池
└─────────────────────┘
- Accept阶段: 主IO Context的Acceptor接收新连接
- 分配阶段: 从IoContextPool中Round-Robin选择一个io_context
- Session创建: 在选定的io_context中创建Session对象
- 请求处理: Session异步读取→解析→处理→响应
- Keep-Alive: 支持连接复用,减少TCP握手开销
- 高并发: 多个IO Context并行处理,避免单点瓶颈
- 负载均衡: Round-Robin策略均匀分配连接
- 资源隔离: 每个Session独立管理,互不影响
- 优雅关闭: 完善的生命周期管理
- C++20: 使用现代C++特性(concepts, ranges等)
- Boost.ASIO: 跨平台异步网络库
- PostgreSQL: 开源关系型数据库(通过libpq)
- Boost.Test: 单元测试框架
- 类成员变量使用
_xxx命名(私有成员) - 对外函数首字母大写(如Golang风格)
- 头文件+实现文件分离(非性能关键模块)
- 使用智能指针管理资源
- 异常安全保证
- ✅ 环境变量存储敏感信息(数据库密码等)
- ✅ 路径验证(防止目录遍历攻击)
- ✅ 请求大小限制
- ✅ 超时机制
# 1. 安装Boost (已配置在 G:/codeEnv/boost_1_84)
# 下载地址: https://www.boost.org/
# 2. PostgreSQL (可选,用于数据库功能)
# 下载地址: https://www.postgresql.org/download/windows/
# 3. CMake 3.20+
# 下载地址: https://cmake.org/download/# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y \
build-essential \
cmake \
libboost-all-dev \
libpq-dev \
postgresql-server-dev-all
# CentOS/RHEL
sudo yum install -y \
gcc-c++ \
cmake \
boost-devel \
postgresql-devel直接 git clone C++便携开发工具库(仅头文件)
- 不想安装的话:
git clone https://github.com/breztop/breutil.git填写 cmake/ 下platform.cmake 中的路径
- 直接安装
git clone https://github.com/breztop/breutil.git
cmake -S breutil -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release --target install# 创建构建目录
mkdir build
cd build
# 生成项目文件
cmake .. -G "Visual Studio 17 2022" -A x64
# 编译
cmake --build . --config Release
# 运行
..\run\breWebserver.exe# 创建构建目录
mkdir build && cd build
# 生成Makefile
cmake .. -DCMAKE_BUILD_TYPE=Release
# 编译
make -j$(nproc)
# 运行
../run/breWebserver编辑 config.ini 文件(可先复制 config.ini.example):
[server]
port=8080
resource_dir=./fronted
[performance]
io_pool_size=0
thread_pool_size=4
timeout=30
[database]
db_host=localhost
db_port=5432
db_name=mydb
db_user=postgres
db_password=your_secure_password
db_pool_size=8
[security]
enable_ssl=false
[advanced]
max_body_size=1048576
keep_alive=true
log_level=infodb_password 涉及敏感信息,建议限制配置文件权限:
chmod 600 config.ini生产环境建议使用部署系统注入机密并在启动前生成配置,避免明文长期存放在仓库或共享目录。
# 编译测试
cd build
cmake --build . --target test_buffer
cmake --build . --target test_http
cmake --build . --target test_threadpool
# 运行单元测试
./test_buffer
./test_http
./test_threadpool
# 或使用CTest运行所有测试
ctest --output-on-failure# 1. 启动服务器(终端1)
./run/breWebserver
# 2. 运行内置benchmark(终端2)
cd build
./benchmark
# 示例输出:
# === Simple Test ===
# Total Requests: 100
# QPS: 2500 req/s
# Avg Latency: 0.4 ms
#
# === Concurrent Test ===
# Threads: 10
# QPS: 8000 req/s
#
# === Keep-Alive Test ===
# Connections: 10
# Requests/conn: 100
# QPS: 12000 req/s
# 3. 使用Apache Bench
ab -n 10000 -c 100 http://localhost:8080/index.html
# 4. 使用wrk
wrk -t4 -c100 -d30s http://localhost:8080/index.html- ✅ Buffer: 缓冲区操作、边界条件、移动语义
- ✅ HTTP: 请求解析、响应构建、文件服务
- ✅ ThreadPool: 任务提交、Future、异常处理、并发
- ✅ Benchmark: 吞吐量、延迟、并发性能
# Linux
./run/breWebserver
# Windows
.\run\breWebserver.exe
# 看到类似输出表示启动成功:
# ========================================
# Bre WebServer 2.0 Starting...
# ========================================
# Server started successfully!
# Listening 127.0.0.1:8080
# Press Ctrl+C to stop...# 浏览器访问
http://localhost:8080/
# 使用curl
curl http://localhost:8080/index.html高效的读写缓冲区,支持:
- 动态扩容
- 零拷贝操作
- CRLF查找
- 移动语义
线程安全的配置管理,支持:
- 从文件加载配置
- 键值对存储
- 默认值支持
- 注释和空行处理
数据库连接池,支持:
- 连接复用
- RAII管理
- 自动重连
- 跨平台(Windows开发时可禁用)
高性能线程池,支持:
- 任务队列
- Future/Promise
- 活跃线程监控
- 优雅关闭
完整的HTTP/1.1实现:
- 请求解析(方法、路径、头部、Body)
- 响应构建(状态码、头部、Body)
- 静态文件服务
- MIME类型识别
基于ASIO的异步服务器:
- 异步Accept
- 异步Read/Write
- 连接管理
- 超时控制
本项目从原有的epoll版本升级为ASIO版本,主要改进:
- 网络库: epoll → Boost.ASIO (跨平台)
- 数据库: MySQL → PostgreSQL
- 标准: C++14 → C++20
- 架构: 更模块化、更解耦
- 配置文件格式已更新
- API接口保持相似但有改进
- 数据库接口需要修改(MySQL → PostgreSQL)
- Windows下PostgreSQL暂时使用占位实现(开发用)
- 暂不支持HTTPS
- 暂不支持WebSocket
- 并发连接: 10000+
- QPS: 取决于硬件和网络
- 内存占用: 低于100MB(空载)
欢迎提交Issue和Pull Request!
MIT License
breeze1396
- Boost.ASIO 社区
- PostgreSQL 项目
- 所有贡献者
注意: 本项目用于学习和研究目的,生产环境使用请谨慎评估。