Server 服务主链路
C++ 后端服务器框架Server 服务主链路
CHAPTER 11

Server 服务主链路

3 分钟阅读 · 596 字

对应文件:

  • 接口:include/Server.h
  • 实现:src/Server.cpp

1. 模块定位

Server 是项目核心,负责:

  • socket 生命周期管理(IPv4/IPv6)
  • 请求接收与 HTTP 解析
  • 路由匹配与 middleware 执行
  • 响应构建与回写
  • 访问日志输出

2. 初始化与启动

2.1 构造函数

  • 初始化端口、线程池、状态
  • 接入 CrashHandler,注册清理回调
  • 注册信号处理

2.2 run()

关键步骤:

  1. Windows 下 WSAStartup
  2. 创建并绑定 IPv4 socket
  3. 尝试创建并绑定 IPv6 socket
  4. listen
  5. 打印路由与访问地址(localhost/LAN)
  6. 启动定时任务 doTaskRegular
  7. 启动 Scheduler
  8. 主循环 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 中:

  1. 循环 recv,直到检测到 header 结束(\r\n\r\n 或 \n\n)
  2. 解析 Content-Length
  3. 按 Content-Length 继续读取 body

保护常量:

  • RECV_CHUNK_SIZE = 64KB
  • MAX_HEADER_SIZE = 1MB
  • MAX_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,完善可观测性闭环
全部章节