HTTP框架 | 青训营笔记

90 阅读2分钟

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

HTTP协议基础

HTTP协议是什么

HTTP:超文本传输协议

为什么需要协议

  • 需要明确的边界,协议何时开始,协议何时结束

  • 需要知道协议能够携带哪些信息,和信息的消息类型

协议里面有什么

graph TD
请求行/状态行 --> 请求头/响应头 --> 请求体/响应体
  • 请求行:方法名,url,协议版本
  • 状态行:协议版本,状态码,状态码描述(1XX:信息类,2XX:成功,3XX:重定向,4XX:客户端错误,5XX:服务端错误)
  • 请求头:请求的元数据,包括长度或者业务逻辑所需要的数据等
  • 响应头:响应的元数据
  • 请求体:请求的数据内容
  • 响应体:响应的数据内容

HTTP协议的请求流程

image.png

路由层的作用是将请求分发给对应的处理函数

传输层是进行数据的传输

HTTP框架的设计与实现

分层设计

优点:高内聚,低耦合,易复用,高扩展性

image.png

老师给我们分享了一句名言,我觉得很有意思,记录一下:

一个切实可行的复杂系统势必会是从一个切实可行的简单系统发展而来的。从头开始设计的复杂系统根本不切实可行,无法修修补补让它切实可行。你必须由一个切实可行的简单系统重新开始。 ---盖尔定律

应用层设计

提供合理的API

  • 可理解性

  • 简单性

  • 冗余性

  • 兼容性

  • 可测性

  • 可见性

中间件设计

中间件的需求:

  • 配合handle实现一个完整的请求处理生命周期

  • 拥有预处理的逻辑与后处理的逻辑

  • 可以注册多个中间件

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

路由的设计

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

最简单的匹配方法:map[string]handlers

缺点:只能匹配静态路由

比较好的方法:使用前缀匹配树

image.png

匹配Http方法: 先根据外层的method的方法进行初筛,如果没有找到响应的路由树,则代表没有。

性能修炼之路

针对网络库的优化

go net:存下全部Header,系统调用次数多,不能复用内存,不能多次读(header过大,一次读不完)

优点:对于流式友好,小包性能高

netpoll:存下全部Header,拷贝出完整的Body

优点:由底层进行buffer管理,所以中大包性能高,时延低

上面就是字节青训营HTTP框架的一个记录,老师的讲解使得我受益匪浅。