学习Day4 http框架 | 青训营

45 阅读2分钟

1.1 协议里有什么

请求行(Request Line):包含请求方法(例如GET、POST)、URL路径和协议版本。
状态行(Status Line):只在响应中出现,包含协议版本、状态码和状态码描述。
请求头(Request Headers):包含额外的请求信息,例如用户代理、内容类型等。
响应头(Response Headers):只在响应中出现,包含额外的响应信息,例如服务器类型、内容长度等。
请求体(Request Body):主要用于POST请求,包含实际的请求数据。
响应体(Response Body):主要用于响应数据,包含服务器返回的实际数据。

1.2 请求流程

image.png

2.1 应用层设计

提供合理api
需要考虑
·可理解性:如ctx.Body(),ctx.GetBody()。不要用ctx.BoayA()
·简单性:如ctx.Request.Header.Peek(key)/ctx.GetHeader(key)
·冗余性:如果有ctx.Body()就不要有ctx.GetBody() ·兼容性 ·可测性:可以测试
·可见性:API应该有文档和示例,方便开发者查阅和理解使用方法。良好的文档可以降低学习成本,提高框架的易用性。

2.2 中间件层设计

中间件需求: 配合Handler实现一个完整的请求处理生命周期
拥有预处理逻辑与后处理逻辑
可以注册多中间件
对上层模块用户逻辑模块易用

image.png 可以将核心逻辑与通用逻辑分离
适用场景
·日志记录
·性能统计
·安全控制
·事务处理
·异常处理

2.3 路由设计

框架路由实际上就是为URL匹配对应的处理函数(Handlers)
静态路由:/a/b/c、/a/b/d
参数路由:/a/:id/c(/a/b/c,/a/d/c)、*all
路由修复:处理URL路径中可能存在的冗余斜杠等问题,确保路径匹配的准确性。 冲突路由以及优先级:/a/b、/:id/c
匹配HTTP方法 :根据请求的HTTP方法(GET、POST等)来匹配对应的处理函数,实现RESTful风格的API设计。 多处理函数:方便添加中间件

2.4 协议层设计

抽象出合适的接口

3.1 针对网络库的优化

go net
·存下全部Header
·减少系统调用次数
·能够复用内存
·能够多次读
go net with bufio
·绑定一块缓冲区
netpoll
·存下全部Header
·拷贝出完整的Body
netpoll with nocopy peek
·分配足够大的buffer
·限制最大buffer size

3.2针对协议的优化 -- Hreaders 解析

找到Header Line边界:\r\n

3.3针对协议的优化 -- Headerkey 规范化

aaa-bbb -Aaa-Bbb 表映射