HTTP
day5
综述
HTTP是什么
HTTP: 超文本传输协议(Hypertext Transfer Protocol)
为什么需要协议
需要明确边界:开始,结束
能够携带信息:什么消息,消息类型等
协议里有什么
(方法名 URL 协议版本)请求行/状态行(协议版本 状态码 状态码描述)
请求头/响应头
请求体/响应体
常见方法名: GET HEAD POST PUT DEL ETE CONNECT OPTIONS TRACE PATCH
不足与展望
HTTP1:队头阻塞(TCP问题) 传输效率低 明文传输不安全
HTTP2:多路复用 头部压缩 二进制协议
QUIC:基于UDP实现 解决队头阻塞 加密减少握手次数 支持快速启动
设计与实现
分层设计
可以让不同层的人专注于各层的设计而不关注其他层
http分层设计需考虑:高内聚 低耦合 易复用 高扩展
共五层:
应用层:抽象,提供api
中间件层:预处理,后处理
路由层:原生路由实现
协议层:协议扩展
网络层:各种逻辑都有
一个切实可行的复杂系统势必是从一个切实可行的简单系统发展而来的。从头开始 设计的复杂系统根本不切实可行,无法修修补补让它切实可行。你必须由一个切实 可行的简单系统重新开始。(盖尔定律)
应用层设计
要提供合理的api:可理解性,简单性,冗余性,兼容性,可测性,可见性
中间件层
需求: 配合Handler实现一个完整的请求处理生命周期 拥有预处理逻辑与后处理逻辑 可以注册多中间件 对上层模块用户逻辑模块易用
经典模型:洋葱模型
路由设计
框架路由是为URL匹配对应的处理函数
路由修复:比如最后一个/要不要敲呢,有路由修复就可以不敲了
一个很棒的匹配法:前缀匹配树
如何匹配http方法:构造好多路由树
如何添加多处理函数:用list存储handler
如何做设计
1.明确需求
2.业界调研
3.方案权衡
4.方案评审
5.确定开发
协议层设计
抽象出合适接口
不要在结构类型中存储上下文;相反,将上下文显式地传递给需要它的每个函数。Context应该是第一个参数
需要在连接上读写数据
网络层设计
B(block)IO 阻塞IO
NIO 注册监听器等足够数据读到再返回
总结
之前只知道http的相关协议以及具体内容,但并不知道http是怎么设计的,经过这次学习了解了http的设计以及其设计思想感觉学了不少闻所未闻的知识,收获很多