HTTP框架的设计与实现
分层设计
应用层设计
提供合理的 API
-
可理解行: 如 ctx.Body() ctx.GetBody()
ctx.BodyA() 是不清晰的
-
简单性: 如 ctx.Request.Header.Peek(key)
/ctx.GetHeader(key) 高频
-
冗余性 有了ctx.Body(),就不要有ctx.GetBody() ,不要一个接口是 两个接口拼接起的
-
兼容性
-
可测性
-
可见性 为了安全性 保障框架的安全性
中间件设计
中间件:不涉及核心功能,为某一个模块添加上一个新的功能,类似于python的装饰器。 需求
- 配合Handler实现一个完整的请求处理生命周期
- 拥有预处理逻辑与后处理逻辑
- 可以注册多中间件
- 对上层模块用户逻辑模块易用
洋葱模型
路由设计
框架路由实际上就是为URL匹配对应的处理函数(Handlers)
路由匹配算法
匹配hhtp方法
构造多个路由树。
协议层设计
网络层设计-传输层
BIO 阻塞IO Block
NIO
go 经典对go func的一个处理 -> 先读完了, 再进行数据的 处理
设置监听器, 当有足够的 数据后 再处理
性能优化
- 针对网络库的优化
- 针对协议的优化 —— Headers解析
- 找到Header Line边界:\r\n
- 从有一定特征的字符串中找(太麻烦)
- 先找到\n看它前一个字符是否是\r
- 这样的话也是O(N)的时间复杂度,能不能更快?
- SIMD Single Instruction Multiple Data
单指令集 多数据
一次处理多条数据
- SIMD Single Instruction Multiple Data
- Header key 规范化
- 热点资源池化