这是我参与「第三届青训营 -后端场」笔记创作活动的第12篇笔记
http协协议
是什么
- 超文本传输协议,text 图片 视频等待
- 为什么需要协议
- 需要明确的边界(开始和结束)
- 能够携带信息
协议里有什么
-
请求行/状态行 (方法名,URL,协议版本【协议版本,状态码,状态码描述】)
-
请求头/响应头
-
请求体/响应体
-
patch和put的区别?
- patch对部分进行更新,put是完整更新
请求流程
各版本对比
- http1
- 队头阻塞
- 传输效率低
- 明文传输不安全
- http2
- TLS/SSL 实现加密传输
- 多路复用
- 头部压缩
- 二进制协议
- QUIC
- 基于UDP的实现
- 解决头部阻塞问题
- 加密减少握手次数
- 支持快速启动
http 框架的设计与实现
分层设计
- 四层框架
- 专注性,扩展性,复用性
- 高内聚、低耦合,易复用,高扩展性
应用层设计
- 提供合理的API
- 可理解性
- 简单性
- 冗余性
- 兼容性
- 可测性
- 可见性
中间件层设计
- 洋葱模型
- 预处理(日志-》metrics)
- 后处理
- 类似调用一个函数
- 多个业务处理 -Next
- 用户忘记主动调用? index设计主动递增
- 出现异常想停止怎么办,调用链,(同时有调用next和无next)坑-不在一个调用栈上
- 其他实现中间件的方式:路由设计
- 框架路由实际上就是为URL匹配对应的处理函数
- 根据路由选择不同的页面
- 路由有静态路由(用map好匹配)和参数路由(map不好匹配)
- 前缀匹配树
- 如何匹配http方法?
- 外层Map:根据method进行初步筛选
- 路由映射表 【Map|method|[前缀树|头节点]】
- 外层Map:根据method进行初步筛选
- 如何实现添加多处理函数? 每个节点用一个list存储handler
- 如何查找路由?
- 协议层设计,抽象出合适的接口
- 网络层设计
- BIO阻塞IO(阻塞等待,可能卡在读数据),NIO(非阻塞,方法:添加监听器)
- 采用NIO,netpoll,网络库管理buffer
- 框架路由实际上就是为URL匹配对应的处理函数
性能修炼之道
实践
- http框架通常是前后端场景用
- RPC框架大部分是内部
- 框架比较多用工厂模式