这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。
课程重点内容:
- HTTP协议
- HTTP框架的设计与实现
- HTTP框架的优化
- 企业实践
HTTP协议
概念:超文本传输协议
POST请求在协议层做了什么?
POST请求时,协议第一行从post开头,之后接上URL,其次是HTTP 1.1,之后有5行都是KV源数据键值对。最后的body部分,存储着真正要传输的内容。接收端通过识别Content-Length的值,根据这个字节指定去接收多少个字节的数据。
server端返回的内容。HTTP 1.1是版本,200是状态码,OK即为对于状态码的文字描述。之后就是KV数据源,最后是回复的具体内容。
协议里的内容总结:
- 请求行/状态行:方法名,URL,协议版本。协议版本,状态码,状态码描述。
- 请求头/响应头:协议约定,业务相关。
- 请求体/响应体。
协议的不足与展望:
- HTTP1:队头阻塞、传输效率低、明文传输。(后续的分片需要等待前面的分片到来才能继续发送后面的数据,否则就会一直等待;http传输一句话同时需要传输很多无用的信息,请求头等等;请求体内的内容也是明文传输,安全性很低)
- HTTP2:多路复用、头部压缩、二进制协议。(HTTP2本质上仍然是基于TCP,所以依然有队头阻塞的问题,并且握手的开销也并没有得到优化)
- QUIC:基于UDP实现、解决了队头阻塞、加密减少握手次数、支持快速启动。
HTTP框架的设计
分层设计
让不同的人专注做某一层次的事情。
应用层的设计:要提供合理的API。(聚焦于易用性、可理解性、简单性)
中间件的设计:
需求:
- 配合Handler实现一个完整的请求处理生命周期
- 拥有预处理逻辑和后处理逻辑
- 可以注册多中间件
- 对上层模块用户逻辑模块易用
路由设计:为URL匹配对应的处理函数(Handlers)
协议层设计:抽象出合适的接口,对协议进行扩展
网络层设计:网络模型 BIO:(block io)listener每次accept获取一个连接之后,会开一个goroutine去单独处理。goroutine先读取数据,再处理业务,然后再将response写回去。