HTTP 框架修炼之道 | 青训营笔记

55 阅读1分钟

HTTP框架的设计与实现

分层设计

应用层设计

提供合理的 API

  • 可理解行: 如 ctx.Body() ctx.GetBody()

    ctx.BodyA() 是不清晰的

  • 简单性: 如 ctx.Request.Header.Peek(key)

    /ctx.GetHeader(key) 高频

  • 冗余性 有了ctx.Body(),就不要有ctx.GetBody() ,不要一个接口是 两个接口拼接起的

  • 兼容性

  • 可测性

  • 可见性 为了安全性 保障框架的安全性

中间件设计

中间件:不涉及核心功能,为某一个模块添加上一个新的功能,类似于python的装饰器。 需求

  • 配合Handler实现一个完整的请求处理生命周期
  • 拥有预处理逻辑与后处理逻辑
  • 可以注册多中间件
  • 对上层模块用户逻辑模块易用

洋葱模型

路由设计

框架路由实际上就是为URL匹配对应的处理函数(Handlers)

image.png

路由匹配算法

匹配hhtp方法

构造多个路由树。

image.png

协议层设计

image.png

网络层设计-传输层

BIO 阻塞IO Block

NIO

go 经典对go func的一个处理 -> 先读完了, 再进行数据的 处理

设置监听器, 当有足够的 数据后 再处理

性能优化

  • 针对网络库的优化
  • 针对协议的优化 —— Headers解析
    • 找到Header Line边界:\r\n
    • 从有一定特征的字符串中找(太麻烦)
    • 先找到\n看它前一个字符是否是\r
    • 这样的话也是O(N)的时间复杂度,能不能更快?
      • SIMD Single Instruction Multiple Data

        单指令集 多数据

        一次处理多条数据

  • Header key 规范化
  • 热点资源池化