HTTP协议基础知识
HTTP协议是什么
HTTP: 超文本传输协议(Hypertext Transfer Protocol)
为什么需要协议
因为在网线上传输的都是只包含0和1的数据流,需要一些规则才能让对方理解
包含内容:
- 明确的边界 --- 开始、结束
- 能够携带信息 --- 什么消息、消息类型
协议里有什么
- 请求行(方法名、URL、协议版本)/状态行(协议版本、状态码、状态码描述)
- 请求头/响应头:分为协议约定的和业务相关的
- 请求体/响应体
不足与展望
- HTTP1:基于TCP,所以会造成队头阻塞;传输效率低;不支持多路复用;明文传输不安全
- HTTP2: 可以多路复用;头部压缩;二进制协议,所以解析起来更高效;但是还会造成队头阻塞
- Quic:基于UDP实现,可以解决队头阻塞;加密减少握手次数;支持快速启动
HTTP协议框架设计
分层设计
分层设计可以使项目具有专注性、扩展性和复用性的特点
应用层设计
提供合理的API:可理解性、简单性、冗余性、兼容性、可测性、可见性
中间件层
需求
- 配合Handler实现一个完整的请求处理生命周期
- 拥有预处理与后处理逻辑
- 可以注册多中间件
- 对上层模块用户逻辑模块易用
适用场景:日志记录;性能统计;安全控制;事务处理;异常处理
通常使用洋葱模型
路由层
为URL匹配对应的处理函数(Handlers)
分为静态路由(/a/b/c、 /a/b/d)和参数路由(/a/:id/c、 /*all)
路由设计:
- map[string]handlers ———— 只能处理静态路由
- 前缀匹配树 ———— 都可以处理
协议层
抽象出合适的接口
传输层
BIO: block.io,如果没有足够数据,会卡住
NIO: 注册了一个监听器,当监听到有足够数据后,再进行一个唤醒
个人总结
通过对HTTP的深入学习,我了解到了分层的重要性。在对项目进行了分层之后,团队中的每个人可以聚焦在自己的那一层,不用担心其他层的运行。同时,分层可以使项目简单化,让项目更加容易上手。