这是我参与「第三届青训营-后端场」笔记创作活动的的第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 逻辑