HTTP 框架 | 青训营笔记

94 阅读2分钟

这是我参与「第三届青训营-后端场」笔记创作活动的的第13篇笔记。

基础知识

协议内容

  • 请求行/状态行
  • 请求头/响应头
  • 请求体/响应体

请求流程

  • 业务层
  • 服务治理层,中间件层
  • 路由层
  • 协议编解码层
  • 传输层

不同版本

  • HTTP1:队头阻塞;传输效率低;明文传输不安全
  • HTTP2:多路复用;头部压缩;二进制协议
  • QUIC:基于UDP实现;解决队头阻塞;加密减少握手次数;支持快速启动

HTTP 框架设计

应用层设计

  • 提供合理的 API:可理解性、简单性、兼容性、可测性

中间件设计

  • 配合 handler 实现一个完整的请求处理生命周期
  • 拥有预处理逻辑和后处理逻辑
  • 可以注册多中间件
  • 对上层模块用户逻辑模块易用

路由设计 根据请求的 URI 选择对应的处理函数。

  • 首先匹配 HTTP 方法
  • 静态路由: 精确匹配注册的路由,如:/a/b/c、/a/b/d
  • 参数路由
  • 路由修复: 如果只注册了 /a/b,但是访问的 URI 是 /a/b/,那可以提供自动重定向到 /a/b 能力;
  • 冲突路由:同时注册 /a/b 和 /:id/b,并设定优先级。比如:当请求 URI 为 /a/b 时,优先匹配静态路由 /a/b
  • 多处理函数

协议层设计

  • 抽象出合适的接口

网络层设计

  • BIO 阻塞IO
  • NIO 非阻塞IO

HTTP 框架优化

针对网络库的优化

  • buffer 设计

针对协议的优化

  • header 解析
    • 更快地找到 header(SIMD)
    • 通过 header key 首字母快速筛除
    • 解析对应 value 到独立字段
    • 使用 byte slice 管理对应 header 存储,方便复用
  • 热点资源池化
    • 减少内存分配
    • 提高内存复用
    • 降低GC压力
    • 但需要额外的 reset 逻辑