相关概念
HTTP协议是什么
HTTP:超文本传输协议(Hypertext Transfer Protocol)
为什么需要协议
- 需要明确边界
- 需要明确能够携带什么信息(规定消息类型等)
HTTP协议示例
HTTP1.1是一个常用的版本
POST \sis HTTP\1.1
Who: Alex
Content-Type: text\plain
Host: 192.0.0.1:8888
Content: Length 28
Let's watch a movie together
大致结构:
常见Method:
- GET : 请求一个指定资源的表达形式,使用GET的请求应该只被用于获取数据。
- POST: 用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用
- PUT: 用请求有效载荷替换目标资源的所有当前表示
- DELETE: 删除指定资源
- HEAD: 请求一个GET请求的响应相同的响应,但没有响应体
- CONNECT: 建立一个到由目标资源标识的服务器的隧道
- OPTIONS: 用于描述目标资源的通信选项
- TRACE: 沿着到目标资源的路径执行一个消息环回测试
- PATCH: 对资源应用部分修改
请求流程
不足与展望
HTTP1
- 队头阻塞
- 传输效率低
- 明文传输不安全
HTTP2
- 多路复用
- 头部压缩
- 二进制协议
QUIC
- 基于UDP实现
- 解决队头阻塞
- 加密减少握手次数
- 支持快速启动
框架设计
分层设计
分层设计时应当满足高内聚、低耦合、易复用、高扩展性等
一个实践:
这种分层设计与HTTP请求过程较为类似,符合一般逻辑
应用层设计
提供合理的API:
- 可理解性:在命名时选择合理的接口名
- 简单性
中间件设计
中间件需求:
- 配合handler实现一个完整的请求处理生命周期
- 拥有预处理逻辑和后处理逻辑
- 可以注册多中间件
- 对上层模块用户逻辑模块易用
洋葱模型
路由设计
框架路由实际上就是为URL匹配对应的处理函数
- 静态路由:/a/b/c、/a/b/d
- 参数路由:/a/:id/c、/*all
- 路由修复:/a/b <=> /a/b/
- 冲突路由以及优先级:/a/b、/:id/c
- 匹配HTTP方法
- 多处理函数:方便添加中间件
存储路由的数据结构:
协议层设计
抽象出合适的接口
网络层设计
两种网络模型:
- BIO 举例:
- NIO 举例: