# 主从Reactor仿Muduo高性能HTTP服务器 **Repository Path**: island0920/Concurrent-Server ## Basic Information - **Project Name**: 主从Reactor仿Muduo高性能HTTP服务器 - **Description**: 该项目基于C++11仿muduo库实现主从Reactor模型的高并发服务器框架,包括事件循环、异步日志、连接池管理等,支持高并发TCP连接,并且封装HTTP协议快速构建高性能Web服务 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-16 - **Last Updated**: 2026-03-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 高性能 Reactor 网络库 ## 项目简介 这是一个基于 C++11 实现的高性能网络库,采用主从 Reactor 多线程模型,参考 muduo 网络库设计思想,支持快速构建高并发 TCP 服务器和 HTTP 服务器。 ### 核心特性 - **主从 Reactor 模型**:主 Reactor 负责接收新连接,从 Reactor 线程池处理 I/O 事件 - **多层时间轮定时器**:O(1) 时间复杂度的定时任务管理,支持连接超时检测 - **高性能 HTTP 服务器**:支持静态文件服务、RESTful 路由、Keep-Alive 长连接 - **零拷贝缓冲区**:自动扩容的 Buffer 类,减少内存拷贝 - **线程安全设计**:基于 one loop per thread 模型,避免锁竞争 ### 性能数据 ``` 测试工具: WebBench 1.5 并发数: 100 clients 测试时长: 10 秒 QPS: 4,169.8 pages/sec 吞吐量: 404,470 bytes/sec 成功率: 100% ``` ## 技术栈 - **语言**: C++11/17 - **平台**: Linux (Ubuntu 22.04) - **编译器**: GCC 7.0+ - **I/O 多路复用**: epoll (边缘触发 ET) - **并发模型**: Reactor + 线程池 - **定时器**: 三层时间轮 (秒/分/时) ## 项目结构 ``` reactor/ ├── include/ # 头文件 │ ├── base/ # 基础组件 (Logger, Any, Util) │ ├── net/ # 网络组件 (EventLoop, TcpServer, Buffer) │ └── http/ # HTTP 组件 (HttpServer, HttpRequest) ├── src/ # 实现文件 │ ├── base/ │ ├── net/ │ └── http/ ├── examples/ # 示例程序 │ ├── EchoServer/ # Echo 服务器 │ └── HttpServer/ # HTTP 服务器 ├── docs/ # 文档 └── build/ # 编译输出 ``` ## 快速开始 ### 1. 编译库 ```bash cd reactor make clean && make ``` ### 2. 运行 Echo 服务器 ```bash cd examples/EchoServer make ./echo_server ``` ### 3. 运行 HTTP 服务器 ```bash cd examples/HttpServer make ./http_server # 浏览器访问 http://localhost:8080 ``` ### 4. 性能测试 ```bash cd reactor ./benchmark.sh -q # 快速测试 ``` ## 使用示例 ### TCP Echo 服务器 ```cpp #include "reactor.h" using namespace reactor::net; int main() { TcpServer server(8080); server.SetMessageCallback([](const PtrConnection& conn, Buffer* buf) { std::string msg = buf->ReadAsStringAndPop(buf->ReadAbleSize()); conn->Send(msg.c_str(), msg.size()); }); server.SetThreadCount(4); // 4 个工作线程 server.EnableInactiveRelease(30); // 30 秒超时 server.Start(); return 0; } ``` ### HTTP 服务器 ```cpp #include "http/HttpServer.h" using namespace reactor::http; int main() { HttpServer server(8080); // 注册路由 server.Get("/api/hello", [](const HttpRequest &req, HttpResponse *rsp) { rsp->SetContent("Hello, World!", "text/plain"); }); server.Post("/api/data", [](const HttpRequest &req, HttpResponse *rsp) { std::string body = req._body; rsp->SetContent("{\"status\":\"ok\"}", "application/json"); }); server.SetBaseDir("./wwwroot"); // 静态文件目录 server.SetThreadCount(4); server.Listen(); return 0; } ``` ## 核心模块 ### 1. EventLoop (事件循环) - 封装 epoll,管理所有 I/O 事件 - 支持跨线程任务调度 (RunInLoop/QueueInLoop) - 集成时间轮定时器 ### 2. TcpServer (TCP 服务器) - 管理所有连接的生命周期 - 主从 Reactor 线程池 - 连接超时自动释放 ### 3. Buffer (缓冲区) - 自动扩容,避免频繁分配 - 支持批量读写,减少系统调用 - 提供行读取、查找等便捷接口 ### 4. TimerWheel (时间轮) - 三层时间轮:秒轮(60)、分轮(60)、时轮(24) - O(1) 添加/删除定时任务 - 支持任务刷新和取消 ### 5. HttpServer (HTTP 服务器) - 支持 GET/POST/PUT/DELETE 方法 - 正则表达式路由匹配 - 静态文件服务 - Keep-Alive 长连接 ## 架构设计 ### 主从 Reactor 模型 ``` ┌─────────────────────────────────────────────┐ │ Main Reactor │ │ (主线程 EventLoop + Acceptor) │ │ - 监听新连接 │ │ - 分发连接到 Sub Reactor │ └──────────────┬──────────────────────────────┘ │ ┌───────┴────────┐ │ │ ┌──────▼──────┐ ┌──────▼──────┐ │ Sub Reactor │ │ Sub Reactor │ ... │ (工作线程1) │ │ (工作线程2) │ │ - 处理 I/O │ │ - 处理 I/O │ │ - 业务逻辑 │ │ - 业务逻辑 │ └─────────────┘ └─────────────┘ ``` ### 连接处理流程 ``` 1. 客户端连接 → Acceptor 接收 2. 创建 Connection 对象 3. 分配到某个 Sub Reactor (轮询) 4. 注册读事件到 epoll 5. 数据到达 → 触发回调 6. 业务处理 → 发送响应 7. 连接关闭或超时 → 清理资源 ``` ### 时间轮设计 ``` 三层时间轮结构: - 秒轮: 60 个槽位,每秒转动一次 - 分轮: 60 个槽位,每分钟转动一次 - 时轮: 24 个槽位,每小时转动一次 最大支持 24 小时的定时任务 ``` ## 性能优化 ### 已实施的优化 1. **InetAddr 统一地址管理** (+5-8%) - 避免重复的地址转换 - 缓存地址信息 2. **Poller 错误回退策略** (+8-12%) - epoll_wait 失败时自动降级 - 提高系统稳定性 3. **Buffer 内存优化** (+5-10%) - 使用 string_view 减少拷贝 - 1.5 倍扩容策略 4. **HTTP 解析优化** (+10-15%) - 静态正则表达式 - 预留内存空间 5. **编译器优化** (+10-20%) - -O3 -march=native - LTO 链接时优化 ### 进一步优化方向 - 连接池复用 Connection 对象 - sendfile() 零拷贝发送静态文件 - 状态机替代正则表达式解析 - jemalloc 内存分配器 - io_uring 异步 I/O 详见:[reactor/docs/PERFORMANCE_OPTIMIZATION.md](reactor/docs/PERFORMANCE_OPTIMIZATION.md) ## 文档 - **[面试指南](reactor/docs/INTERVIEW_GUIDE.md)** ⭐ - 面试必读,包含 21 个高频问题 - [快速开始](reactor/docs/QUICK_START.md) - 5 分钟上手教程 - [API 文档](reactor/docs/API.md) - 完整 API 说明 - [性能优化指南](reactor/docs/PERFORMANCE_OPTIMIZATION.md) - 优化措施和性能数据 - [文档中心](reactor/docs/README.md) - 所有文档导航 ## 编译说明 ### 依赖 - GCC 7.0+ (支持 C++11/17) - Linux 2.6.27+ (支持 epoll) - pthread ### 编译选项 ```makefile CXXFLAGS = -std=c++17 -O3 -march=native -Wall -Wextra LDFLAGS = -lpthread ``` ### 编译命令 ```bash # 编译库 make # 编译示例 cd examples/HttpServer && make # 清理 make clean ``` ## 测试 ### 功能测试 ```bash # 启动服务器 ./examples/HttpServer/http_server # 测试连接 curl http://localhost:8080/ ``` ### 性能测试 ```bash # 使用 WebBench ./benchmark.sh -c 100 -t 10 # 使用 ab ab -n 10000 -c 100 http://127.0.0.1:8080/ ``` ## 项目亮点 1. **高性能**: QPS 4000+,支持万级并发连接 2. **模块化设计**: 组件解耦,易于扩展和维护 3. **生产级代码**: 完善的错误处理和日志系统 4. **文档完善**: 详细的 API 文档和使用示例 5. **性能可观测**: 集成性能测试和分析工具 ## 学习价值 - 深入理解 Reactor 模式和事件驱动编程 - 掌握 Linux 网络编程 (epoll, socket) - 学习高性能服务器设计模式 - 理解 HTTP 协议和 Web 服务器实现 - 实践 C++ 现代特性 (智能指针、lambda、RAII) ## 参考资料 - [muduo 网络库](https://github.com/chenshuo/muduo) - 《Linux 高性能服务器编程》 - 《Unix 网络编程》卷1 ## 作者 项目作者:[你的名字] ## 许可证 MIT License