http学习| 青训营

45 阅读2分钟

HTTP协议

  • HTTP协议是进行Web开发时逃不开的一个重要协议。它实现了超文本的信息通讯,使得视频、音频等格式的内容可以像文件一样实现可靠的稳定传输。但在实际编程中,直接调用http协议进行编程的话是十分复杂且费时的,需要考虑各个层的设计。因此,在实际Golang开发中,往往会用gin等框架来进行快速编程。今天我们就学习了这些框架的设计中的思路与一些重要原则,最后还学习了http性能修炼的原则。

http协议的架构

  • http协议分成了业务层、中间件层、路由层、协议编(解)码层和传输层。每个层都实现了不同的功能,而这些层的功能组合起来就实现了超文本的信息通信。

http框架的设计的原则

  • 在http框架的设计时要注意降低耦合性并提高可扩展性,目的是实现模块化的编程与功能的移植。
  • 在设计提供给用户的API时,要尽可能简单,同时简洁明了的体现功能,要便于调用。
  • Handler()函数的设计要注意错误处理和考虑特殊情况,如出现异常情况时如何停止。
  • 在设计路由时,要考虑到分支的合理性与简明性,要尽量避免互相混淆或者路由冲突。

http性能修炼

  • 针对网络库的优化

    • 现存要求

      • 存下全部的Header
      • 减少系统调用次数
      • 能够复用内存
      • 能够多次读
    • 不同库的优势

      • go net:流式友好、小包性能好
      • netpoll:中大包性能好、时延低
  • 针对协议的优化

    • Headers解析

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

        • 通过Header key首字母来快速筛除完全不可能的key
        • 解析对应value到独立字段
        • 使用byte slice管理对应Header存储,方便复用
        • 舍:普通Header效能较低,没有map结构
    • Header key规范化

      • 命名规范化,首字母大写、大小驼峰等
    • 热点资源池化

      • 要求整个过程与request一一对应,贯穿一个请求的始终
      • 取:减少内存分配;底稿内存复用;降低GC压力;性能提升
      • 舍:额外的Reset逻辑;请求内有效;问题定位难度加大
  • 总结

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