CHAPTER 11
Server 服务主链路
对应文件:
- 接口:
include/Server.h - 实现:
src/Server.cpp
1. 模块定位
Server 是项目核心,负责:
- socket 生命周期管理(IPv4/IPv6)
- 请求接收与 HTTP 解析
- 路由匹配与 middleware 执行
- 响应构建与回写
- 访问日志输出
2. 初始化与启动
2.1 构造函数
- 初始化端口、线程池、状态
- 接入
CrashHandler,注册清理回调 - 注册信号处理
2.2 run()
关键步骤:
- Windows 下
WSAStartup - 创建并绑定 IPv4 socket
- 尝试创建并绑定 IPv6 socket
listen- 打印路由与访问地址(localhost/LAN)
- 启动定时任务
doTaskRegular - 启动
Scheduler - 主循环
accept,将连接投递ThreadPool
3. 路由与中间件
3.1 路由注册
get/post/put/del支持带/不带 middleware 重载- 底层存储:
routes_[method][path] = RouteEntry
3.2 全局中间件
use(Middleware)追加到middlewares_- 请求执行链:
- 全局 middleware
- 路由 middleware
- handler
3.3 RouterGroup
- 支持前缀分组与 middleware 继承
resolvePath处理/拼接细节
4. 请求接收与解析
4.1 两阶段接收模型
在 handleClient/handleClientIPv6 中:
- 循环
recv,直到检测到 header 结束(\r\n\r\n或\n\n) - 解析
Content-Length - 按
Content-Length继续读取 body
保护常量:
RECV_CHUNK_SIZE = 64KBMAX_HEADER_SIZE = 1MBMAX_BODY_SIZE = 100MB
4.2 parseRequest
- 解析请求行:method/path
- 解析 query 参数(
parseQueryParams) - 解析 headers
- 按
Content-Length截取 body request.parseBody()继续分 content-type 解析
5. 响应构建
buildResponse 逻辑:
- 状态行(HTTP/1.1 + status)
- CORS 头(固定注入)
- 输出自定义 headers
- 若未显式
Content-Length,自动补齐 - 非流式响应写 body
- 流式响应由
Response::streamWriter发送主体
6. 日志与可观测性
- 每次请求输出:
- client ip
- method/path/query
- status
- body length
- cost time
- 另有
Log::getInstance()->write(...)记录文本日志
7. 停止与清理
stop():running_ = false- 停
Scheduler - 关闭 server socket
cleanup()(崩溃回调路径):- 停循环、关 socket、停调度器
8. 关键风险点(面试高频)
- HTTP 协议兼容:
- 当前主要依赖
Content-Length,chunked支持不足
- 当前主要依赖
- 长连接:
- 处理后直接 close,keep-alive 能力有限
- 路由能力:
- 精确匹配,不支持参数路由(如
/users/:id)
- 精确匹配,不支持参数路由(如
- 错误治理:
- 业务错误码规范与统一 envelope 仍可加强
9. 改进建议
- 引入事件驱动 I/O(epoll/IOCP)减少阻塞线程占用
- 增加参数路由、正则路由、通配符
- 增加请求超时、限流、连接级治理
- 增加 metrics/tracing,完善可观测性闭环