这是我参与「第三届青训营 - 后端场」笔记创作活动的的第 3 篇笔记。
HTTP 协议是当今使用最为广泛的协议之一。我们一般会使用 HTTP 框架来完成我们的 HTTP 后端,如 Gin, Spring 等等。
下面是一些 HTTP 框架的设计与实现的笔记。
HTTP 协议
HTTP 即 hypertext transfer protocol。
协议需要什么
-
需要明确的边界:开始、结束
-
能够携带信息:消息内容、消息类型
协议里有什么
-
GET、POST、PUT、DELETE 等等方法
-
请求头 / 响应头
请求头:协议约定 + 业务相关
响应头:协议约定 + 业务相关
- 请求行 / 状态行
请求行:方法名 + URL + 协议版本
状态行:协议版本 + 状态码 + 状态码描述
- 请求体
其中状态码有:
1xx: 信息类
2xx: 成功
3xx: 重定向
4xx: 客户端错误
5xx: 服务端错误
HTTP 请求流程
-
业务层
-
中间件层
-
路由层
-
协议编码层
-
传输层
HTTP 相关协议缺点和优点
HTTP1:队头阻塞、传输效率低、明文传输不安全
HTTP2:多路复用、头部压缩、二进制协议
QUIC:基于UDP实现、解决队头阻塞加密、减少握手次数、支持快速启动
框架分层设计
- 应用层
提供合理的 API,不要在文档中说明,很多用户不看文档。
冗余性、兼容性、可测性、可见性
- 中间件层
中间件需求:
1 配合Handler实现一个完整的请求处理生命周期
2 拥有预处理逻辑与后处理逻辑
3 可以注册多中间件
4 对上层模块用户逻辑模块易用
可用于:日志记录、性能统计、安全控制、事务处理、异常处理
- 路由层
前缀匹配树,框架路由实际上就是为 URL 匹配对应的处理函数。
- 协议编码层
抽象出合适的接口
- 网络层
网络模型
高性能 HTTP 框架
go net:流式友好、小包性能高
netpoll: 中大包性能高、时延低
Headers 解析:核心字段快速解析、使用byte slice存储、额外存储到成员变量中、普通header性能较低、没有map结构。