这是我参与「第三届青训营 -后端场」笔记创作活动的的第15篇笔记, 本文主要介绍了HTTP框架相关知识。
再谈HTTP协议
HTTP是什么
超文本传输协议:文本,图片,视频,音频
为什么需要协议
- 需要明确的边界
- 能够携带信息
协议里有什么
请求流程
不足和展望
Http框架的设计与实现
分层设计
\
应用层设计
提供合理的API
中间件设计
洋葱模型
举例:打印每个请求的req和rep
- index保持递增,自动调用
- 出现异常想停止怎么办
调用链
问题:不在一个调用栈上,
适用场景:
- 不调用next
-
- 初始化逻辑且不需要在同一个调用栈
- 调用next
-
- 后处理逻辑需要在同一个调用栈
路由设计
如何匹配HTTP方法
外层Map:根据method筛选
如何实现多处理函数
协议层设计
抽象出合适的接口
- 把ctx写到参数里面显式传递
- 需要在连接上读写数据
网络层设计
- BIO:读数据阻塞
- NIO:注册监听器,readable读到足够的数据,就不会阻塞
go net
用户管理buffer
netpoll(NIO)
- 网络库管理buffer
- 底层有足够的数据n之后,才会唤醒
性能修炼之道
针对网络库的优化
go net采用BIO模型
为每个连接绑定一个大小为4k的buffer
- 指针不动Peek()
- Discard() 指针向前移动
- Release() 复用
netpoll
不同网络库的优势
针对协议的优化--Headers解析
找到Header Line边界 : \r\n
- 先找到\n再看他前一个是不是\r O(n)
- 能不能更快呢? SIMD
-
- 多数据流技术
- 加速效果
- 首字母筛选,对于host,筛选首字母
针对协议的优化--Header key规范化
- aaa-bbb变成Aaa-Bbb
- 采用表映射的方式,将对应的字节转化为ASCII,在对应的表里面查找匹配,复杂度 O(1)
热点资源池化
- 与请求一一对应,RequestContext贯穿整个生命周期
- 池化,用的时候拿出来,用完了放回去