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解析、热点资源池化