HTTP框架修炼之道(一)|青训营笔记

62 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。

课程重点内容:

  • HTTP协议
  • HTTP框架的设计与实现
  • HTTP框架的优化
  • 企业实践

8e3c1fa127d8f8d7ce4884043f15a2b.png

HTTP协议

概念:超文本传输协议

POST请求在协议层做了什么?

1655188454828.png

1655188475843.png

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框架的设计

分层设计 1655189363507.png 让不同的人专注做某一层次的事情。

应用层的设计:要提供合理的API。(聚焦于易用性、可理解性、简单性)

中间件的设计:

需求:

  1. 配合Handler实现一个完整的请求处理生命周期
  2. 拥有预处理逻辑和后处理逻辑
  3. 可以注册多中间件
  4. 对上层模块用户逻辑模块易用

路由设计:为URL匹配对应的处理函数(Handlers)

协议层设计:抽象出合适的接口,对协议进行扩展

网络层设计:网络模型 BIO:(block io)listener每次accept获取一个连接之后,会开一个goroutine去单独处理。goroutine先读取数据,再处理业务,然后再将response写回去。

587a34b836b0cebf7724793f415193c.png