HTTP框架 | 青训营笔记

114 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记

HTTP的修炼

终端 前端路由 页面 状态管理,API接口层

HTTP请求

请求解析 后端路由 业务逻辑 数据库

HTTP协议

  • HTTP协议什么

    • 第一个版本是HTTP0.9,1991
    • 超文本传输协议(Hypertext Transfer Protocol)
  • 为什么需要协议

    • 需要明确的边界 开始 结束
    • 能够携带的信息,什么消息,消息类型、
  • 协议有什么

    • 请求行/状态行

      • 方法名/URL/协议版本
      • 协议版本/状态码/状态码描述
    • 请求头/响应头

    • 请求体/响应体

  • 请求流程

    • 业务层
    • 服务治理层,中间层
    • 路由层
    • 协议编码层
    • 传输层
  • 不足与展望

    • HTTP1

      • 队头阻塞
      • 传输效率低
      • 明文传输不安全
    • HTTP2

      • 多路复用
      • 头部压缩
      • 二进制协议 解释起来更加高效
    • QUIC

      • 基于UDP实现
      • 减少队头阻塞
      • 加密减少握手次数
      • 支持快速启动

HTTP框架的实现

  • 分层设计

    • 专注性 扩展性 复用性
  • 高内聚 低耦合 易复用 高扩展性

  • 应用层 中间件 路由 协议层 网络层 transport

  • 应用层设计

    • 提供合理的API
    • 可理解性 ctx.Body(),ctx.GetBody()
    • 简单性
    • 冗余行
    • 兼容行
    • 可测性
    • 可见性
  • 中间件层

    • 配合Handler实现一个完整的请求处理声明周期

    • 拥有预处理逻辑和后处理逻辑

    • 可以注册中间件

    • 对上层模块用户逻辑模块易用

    • 洋葱模型

      • 核心逻辑与通用逻辑分离
    • 中间件设计

      • 路由上可以注册Middleware,同时也可以满足请求级别有效,只需要将Middlware设计为业务和Handler相同即可
  • 路由设计

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

      • 静态路由 /a/b/c、
      • 参数路由 /a:id/c
      • 路由修复
      • 冲突路由以及优先级
      • 匹配HTTP方法
      • 多处理函数 方便添加中间件
      • 前缀匹配树
      • 网络层设计

        • 网络模式

      针对网络库的优化

      • go net

        • 存下全部Header

        • 减少系统调用的次数

        • 能够复用内存

        • 能够多次读

          netpool

          存下全部Header

          拷贝出完整的Body

          中大包 性能高,时延

        针对协议的优化

        找到Header Line 边界 :\r\n

        先找到\n再看它前一个是不是\r

        SIMD 一组指令对数据进行变形操作

        自动使用simd进行加速操作

        编解码速度

        针对协议相关的Headers快速解析

        • 通过Header key首字母快速筛选掉完全不可能的key
        • 解析对应value到独立字段
        • 使用byte slice管理对应header存储 方便复用

      取 超高的转换效率 比net.http提高40倍

      舍 额外的内存开销 变更困难

热点资源池优化

取 减少了内存分配 提高了内存复用 降低了GC压力 性能提升

舍 额外的Reset逻辑 请求内有效 问题定位难度增加

追求性能 追求易用 减少误用