HTTP框架 | 青训营笔记

87 阅读2分钟

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

为什么采用分层设计

分层设计具有专注性,扩展性,复用性,高内聚,低耦合。每一层专注于自己的东西,而无需关注其他层的实现细节。

应用层设计

  1. 提供合理的API。保证API具有可理解性,简单性,非冗余性,可测性以及可兼容性

中间件设计

需求:

  1. 配合handler实现一个完整的请求处理生命周期
  2. 拥有预处理逻辑和后处理逻辑
  3. 可以注册多个中间件
  4. 对上层模块用户易用。 采用洋葱模型,核心逻辑于通用逻辑分离,用于预处理和后处理。适用于:日志记录,性能统计,安全控制,事务处理,异常处理等。

image.png

将中间件设计的和业务handler相同,那么从一个中间件到另一个中间件以及从一个中间件到handler都可以使用同样的函数(next)来实现。

用户如果不调用next怎么办?主动帮用户调用之后的中间件。

image.png

出现异常想要停止怎么办?

image.png

调用链路

image.png A中调用next,进入B,B没有调next,回到A的next,然后进入C,进入handler,依次返回。

路由设计

设计需求:

  1. 静态路由
  2. 参数路由
  3. 路由修复,/a/b->/a/b/
  4. 冲突路由以及优先级
  5. 匹配HTTP方法,gep,post等,使用多个前缀树,每种方法对应一个。
  6. 多处理函数,方便添加中间件。节点上用链表存储handler 实现方式
  7. map[string]handlers
  8. 前缀树(字典树变体)

协议设计

抽象出server接口

  1. 要有context处理请求上下文
  2. 在TCP连接上读取数据

网络层设计

阻塞IO和非阻塞IO(通知机制)

go net包使用的是阻塞IO,用户自己管理buffer image.png netpoll库使用的是非阻塞IO,网络库管理buffer image.png