HTTP 框架 | 青训营笔记

116 阅读2分钟

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