Go 语言HTTP | 青训营笔记

105 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

本文为青训营课程笔记,配合原课程食用效果更佳哦~

课程笔记

再谈 HTTP 协议

  1. HTTP 协议是什么:超文本 传输协议(Hypertext Transfer Protocol)

  2. 为什么需要协议

    1. 需要明确的边界

      • 开始
      • 结束
    2. 能够携带信息

      • 什么消息
      • 消息类型
  3. 请求流程

  4. 协议里有什么

    1. 请求

      1. 请求行

        • 方法名(常见方法名:GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH
        • URL
        • 协议版本
      2. 请求头

        • 协议约定
        • 业务相关
      3. 请求体

    2. 响应

      1. 状态行

        • 协议版本
        • 状态码(状态码:1xx:信息类、2xx:成功、3xx:重定向、4xx:客户端错误、5xx:服务端错误
        • 状态码描述
      2. 响应头

        • 协议约定
        • 业务相关
      3. 响应体

    3. 不足与展望

      1. HTTP1

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

        • 多路复用
        • 头部压缩
        • 二进制协议
      3. QUIC

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

性能修炼之道

  1. go net 存下全部 Header 减少系统调用次数 能够复用内存 能够多次读

  2. netpoll 存下全部 Header 拷贝出完整的 Body

  3. 分配足够大的 buffer 限制最大 buffer size

  4. 3.2 针对协议的优化 -- Headers 解析

    取:核心字段快速解析、使用byte slice存储

    舍:额外存储到成员变量中、普通 header 性能较低、没有 map 结构

  5. 针对协议的优化 -- Headers 解析

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

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

  6. 热点资源池化 取:减少了内存分配、提高了内存复用、降低了GC压力、性能提升 舍:额外的 Reset 逻辑、请求内有效、问题定位难度增加

  7. 总结 针对网络库的优化:buffer 设计 针对协议的优化:header 解析、热点资源池化

总结收获

通过样例与知识点结合的方式,学到了一些 HTTP框架的相关知识 ;

通过样例的讲解,更了解了具体的 HTTP技术 ;

又是收获满满的一天

引用参考

青训营官方课程视频

青训营官方课程文档

青训营官方课程笔记