HTTP协议简介
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出。而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。
HTTP格式为 请求行/状态行-请求头/响应头-请求体/响应体
请求流程分为业务层-服务治理层(中间件层)-路由层-协议编码层-传输层
HTTP框架的设计与实现
- 使用高内聚,低耦合,容易复用并且扩展性高的分层设计
| 设计模块 | 需求 | 实际例子 |
|---|---|---|
| 应用层设计 | 冗余性、兼容性、可测性、可见性 | 略 |
| 中间件需求 | 完整的请求处理周期、预处理与后处理、多中间件、上层模块接口简洁 | 洋葱模型 |
| 路由设计 | 静态路由、参数路由、路由修复、冲突路由与优先级、匹配HTTP方法、添加中间件的多处理函数 | 前缀匹配树 |
| 协议层设计 | 合适接口、在连接上读取数据 | 抽象接口 |
| 网络层设计 | BIO、NIO | 网络模型 |
性能提升
针对网络库的优化
| 设计模块 | 需求 | 解决办法 | 特点 |
|---|---|---|---|
| go net | 存下全部header 减少系统调用次数、能够复用内存、能够多次读 | go net with bufio | 流式友好、小包性能高 |
| netpoll | 存下全部Header、拷贝出完整的Body | netpoll with nocopy peek 分配足够大的buffer、限制最大buffer size | 中大包性能高、时延低 |
针对协议的优化
- 针对协议相关Headers的快速解析
- 通过Header Key首字母快速筛选
- 解析对应Value独立字段
- 使用byte slice管理header储存
- Header Key规范化
- 使用表映射的方式而非使用ASCII加减值
热点资源池化
- 使用RequestContext池,与请求一一对应,贯穿一个请求始终
- 减少内存分配,提高复用率,降低GC压力
- 需要额外的Reset逻辑,在请求内有效,定位问题困难
企业实践
- 追求性能
- 追求易用性、减少误用
- 内部生态
- 文档建设与用户群建设
学习小结
今天学习的有关HTTP框架构建与优化实践的内容其实是偏向于理论部分的,我们在实现一个具体项目的过程中其实也比较少会自己去从零开始构建一个HTTP框架而是使用现成的框架,但是这种理论学习还是非常有必要的,这可以让我们更加了解计算机进行网络通信的基本原理与优化方法,对于我们写出更好的更高效的代码也是非常有帮助的