HTTP框架修炼之道

382 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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贯穿整个生命周期

  • 池化,用的时候拿出来,用完了放回去