这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
HTTP协议
协议概述
- HTTP:超文本传输协议,超文本的意思是传输的内容不仅仅是文本,还可以是视频、图片、音频等媒体内容
- 为什么需要协议?
- 传输过程中需要定义数据流的边界
- 需要描述不同的数据类型
协议内容
- 请求
- 请求行:请求方法名,URL,协议版本
- 请求头:协议元数据,用于描述请求信息
- 请求体:需要传输的业务数据
- 响应
- 响应行:协议版本,状态码,状态描述
- 响应头:协议元数据,用于描述响应信息
- 响应体:需要响应的业务数据
请求流程
不同版本比较
- HTTP1
- 对头阻塞
- 传输效率低
- 明文传输
- HTTP2
- 多路复用
- 头部压缩
- 二进制协议
- QUIC
- 基于UDP实现的可靠传输
- 解决对头阻塞
- 加密减少握手次数
- 支持快启动
HTTP框架设计与实现
一个切实可行的复杂系统势必是从一个切实可行的简单系统发展而来的。从头开始设计的复杂系统根本不切实可行,无法修修补补让它切实可行。你必须由一个切实可行的简单系统重新开始。
—— 盖尔定律
应用层设计
提供合理的API是应用层该做好的事情,好的API设计主要可以从以下几方面考量:
- 可解释性:从方面名或者调用链即可看出该API的功能
- 简单性:对于常用的API尽可能缩短调用长度
- 冗余性:减少功能重复的接口
- 兼容性
- 可测性
- 可见性
中间件设计
- 中间件需求:
- 配合Handler实现一个完整的请求处理生命周期
- 拥有预处理与后处理逻辑
- 可注册多个中间件
- 对上层模块用户逻辑易用
- 使用洋葱模型设计,将核心逻辑与通用逻辑分离,适用场景有:日志,性能统计,安全控制,事务,异常处理
- 既然要实现预处理和后处理,那这个就很像调用了一个函数
- 路由上可以注册多Middleware, 同时也可以满足请求级别有效,只需要将Middleware设计为和业务和Handler 相同即可。
路由设计
- (初级)使用map存储路由与handler的映射关系,适用于静态路由
- (高级)前缀匹配树
- 匹配树的root即为method
协议层设计
抽象出合适的接口
网络层设计
1. go net 是BIO
2. netpoll框架采用NIO的模式
HTTP框架性能优化
网络库优化
- 存下全部 Header
- 减少系统调用次数
- 能够复用内存
- 能够多次读
协议优化
- Headers 解析
- Header key 规范化
- 热点资源池化
参考资料
HTTP 框架修炼之道 .pptx - 飞书云文档 (feishu.cn)