HTTP协议
Hypertext Transfer Protocol
协议结构
| 请求 | 响应 | |
|---|---|---|
| 请求/响应行 | 请求方法、URL、协议版本 | 协议版本、状态码、描述 |
| 请求/响应头 | key:Value \r\n | key:Value \r\n |
| 请求/响应体 | 请求数据 | 响应数据 |
请求流程
缺陷
| HTTP1 | HTTP2 | QUIC |
|---|---|---|
| 队头阻塞 | 多路复用 | 基于UDP |
| 效率低 | 头压缩 | 解决队头阻塞 |
| 明文传输 | 二进制协议 | 加密减少握手次数 |
| 支持快速启动 |
HTTP框架设计
- 分层设计(OSI七层模型,TCP/IP四层模型)
- 专注性--->高内聚、低耦合
- 扩展性--->高扩展
- 复用性--->易服用
- 提供合理的API
- 易理解,简单
- 中间件设计
- 配合handler实现完整请求处理声明周期
- 预处理/后处理逻辑
- 可以注册多中间件
- 对上层模块用户逻辑模块易用
- 洋葱模型:核心逻辑和通用逻辑分离
- 路由设计
- 为URL匹配对应的处理函数
- MAP
- 初步根据method筛选
- 确定方法后由前缀树匹配路由
- 协议层设计
- 抽象出合适的接口
- 快速解析
- 核心字段快速解析
- 定位Header line边界
- SIMD加速
- 协议相关的headers快速解析
- 首字母删除不可能的key
- 解析value到独立字段
- byte slice 管理header存储,方便复用
- header key规范化
- 热点资源池化
- 减少内存分配、提高内存服用
- 降低GC压力,提升性能
- 额外的逻辑
- 定位问题难度增加
- 核心字段快速解析
- 网络/传输层设计
- BIO
- 绑定一块缓冲区减少系统调用次数
- 流式友好
- 小包性能好
- NIO
- buffer池,分配足够大buffer
- 中大包性能好
- 时延低
- BIO
此外,企业实践的框架设计时需要关注
- 性能
- 毫无疑问优化的核心目标之一
- 易用,减少误用
- 增强推广的核心
- 打通内部生态
- 易用性另一体现-->与其他组件好接通
- 不能为了追求性能而过于独立
- 文档建设、用户群建设
- 减轻维护压力