一、http框架的设计与实现
分层设计:专注性、扩展性、复用性;
Osi七层网络模型:应用层(application);表示层()presentation;会话层(session);传输层(transport);网络层(network);数据链路层(datalink);物理层(physical)
Tcp/ip四层概念模型:应用层;传输层;网络层;数据链路层;
对应网络协议:http\tftp\ftp\nfs\wais\smtp;
telnet\plogin\snmp\gopher;
smtp,dns;
tcp\udp;
ip\icmp\arp\rarp\akp\uucp;
高内聚、低耦合、易复用、高扩展性
盖尔定律:一个切实可行的复杂系统必是从一个切实可行的简单系统发展而来的
应用层设计:·提供合理的api:可理解性(一眼能看出来函数等的意义)
·简单性:减少高层接口的暴露
·冗余性:去除具有相同功能的接口;或者具有相重叠功能的接口
·兼容性·可测性· ·可见性
即不要试图在文档中说明,很多用户看不见文档
中间件设计:中间件需求:
·配合handler实现一个完整的请求处理生命周期
·拥有·预处理逻辑与后处理逻辑
·可以注册·多中间件·
·对上层模块·用户逻辑模块易用
洋葱模型:
Request\response:使用场景:日志记录·性能统计·安全控制·事务处理·异常处理
核心逻辑与通用逻辑分离:日志…
既要实现预处理和后处理,那就很像调用了一个函数
路由上可以注册多middleware,同时也可以满足请求级别有效,只需要讲middleware设计为和业务和handler相同即可
用户如果不主动调用下一个预处理函数这怎么办?
出现异常想停止怎么办?
调用链:中间件A
它们不在同一个调用栈上
使用场景:不调用next:初始化逻辑且不需要在同一调用栈
调用next:后处理逻辑或需要在同一调用栈上
寻找其他方式:
路由设计:框架路由实际上就是为url匹配对应的处理函数
静态路由、参数路由、路由修复、冲突路由以及优先级、匹配http方法;多处理函数。
简单代码——前缀树
对于路由有更强的适应性
匹配路由方法:路由映射表:外层map:根据method进行初步筛选
如何实现添加多处理函数?
明确需求、业界调研、方案权衡、方案评审、确定开发。