这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记
为什么采用分层设计
分层设计具有专注性,扩展性,复用性,高内聚,低耦合。每一层专注于自己的东西,而无需关注其他层的实现细节。
应用层设计
- 提供合理的API。保证API具有可理解性,简单性,非冗余性,可测性以及可兼容性
中间件设计
需求:
- 配合handler实现一个完整的请求处理生命周期
- 拥有预处理逻辑和后处理逻辑
- 可以注册多个中间件
- 对上层模块用户易用。 采用洋葱模型,核心逻辑于通用逻辑分离,用于预处理和后处理。适用于:日志记录,性能统计,安全控制,事务处理,异常处理等。
将中间件设计的和业务handler相同,那么从一个中间件到另一个中间件以及从一个中间件到handler都可以使用同样的函数(next)来实现。
用户如果不调用next怎么办?主动帮用户调用之后的中间件。
出现异常想要停止怎么办?
调用链路
A中调用next,进入B,B没有调next,回到A的next,然后进入C,进入handler,依次返回。
路由设计
设计需求:
- 静态路由
- 参数路由
- 路由修复,/a/b->/a/b/
- 冲突路由以及优先级
- 匹配HTTP方法,gep,post等,使用多个前缀树,每种方法对应一个。
- 多处理函数,方便添加中间件。节点上用链表存储handler 实现方式
- map[string]handlers
- 前缀树(字典树变体)
协议设计
抽象出server接口
- 要有context处理请求上下文
- 在TCP连接上读取数据
网络层设计
阻塞IO和非阻塞IO(通知机制)
go net包使用的是阻塞IO,用户自己管理buffer
netpoll库使用的是非阻塞IO,网络库管理buffer