241124学习日志——[CSDIY] [ByteDance] 后端训练营 [14]
CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!!
第一弹:Cpp零基础学习【30 DAYS 从0到1】
第二弹:Cpp刷题文档【LeetCode】
第三弹:Go开发入门【字节后端青训营】
第四弹:Cpp简单项目开发【黑马Rookie】
第五弹:数据结构绪论【数据结构与算法】
第六弹:Go工程实践【字节后端青训营】
第七弹:高质量编程和性能调优【字节后端青训营】
第八弹:Linux 基础知识【书生大模型训练营】
第九弹:Python 基础知识【书生大模型训练营】
第十弹:Git 基础知识【书生大模型训练营】
第十一弹:玩转HF/魔搭/魔乐社区【书生大模型训练营】
第十二弹:书生大模型全链路开源体系【书生大模型训练营】
第十三弹:玩转书生「多模态对话」与「AI搜索」产品【书生大模型训练营】
第十四弹:浦语提示词工程实践【书生大模型训练营】
第十五弹:HTTP 框架修炼之道【字节后端青训营】
课程背景:
- HTTP 请求(一)
- API 接口层
- 状态管理
- 页面
- 前端路由
- 终端
- HTTP 请求(二)
- 请求解析
- 后端路由
- 业务逻辑
- 数据库
01. 再谈 HTTP 协议
1991年,开始大规模使用…三十多岁还在更新…可见生命力之强
1.1 HTTP 协议是什么
HTTP:超文本传输协议(Hypertext Transfer Protocol)
1.2 为什么需要协议
需要明确的边界
- 开始和结束 [协议开始] [协议结束]
1.3 协议里有什么
发送端
POST /sis HTTP/1.1
Who: Alex
Content-Type: text/plain
Host:17.0.0.1:8888
Content-Lenth: 28
Let's watch a movie together
接受端
HTTP/1.1 200 OK
Server: hertz
Date: Thu, 21 Apr 2022 11:46:32 GMT
Content-Type: text/plain; charse=utf-8
Content-Length: 2
Upstream-Caught: 1650541592984580
OK
内容
请求行 / 状态行:
- 方法名 - URL - 协议版本
- 协议版本 - 状态码 - 状态码描述
请求头 / 响应头:…
请求体 / 响应体:…
1.4 请求流程
服务端
客服端
业务层 - 服务治理层/中间件层 - 路由层 - 协议编/解码层 - 传输层
1.5 不足和展望
HTTP1:
-
队头阻塞
-
传输效率低
-
明文传输不安全
HTTP2:
- 多路复用
- 头部压缩
- 二进制协议
QUIC:
-
基于 UDP 实现
-
解决队头阻塞
-
加密减少握手次数
-
支持快速启动
02. HTTP 框架的设计与实现
2.1 分层设计
OSI 七层网络模型、TCP/IP 四层概念模型
- 专注性
- 扩展性
- 复用性
高内聚 低耦合 易复用 高扩展性
2.2 应用层 API 设计
提供合理地 API
- **可理解性。**命名合理易理解
- **简单性。**尽量简介
- **冗余性。**做同样地事情地接口只保留一个
- 兼容性。
- 可测性。
- 可见性。
不要试图在文档中说明,很多用户不看。
2.3 中间件设计
中间件需求
洋葱模型:核心逻辑与通用逻辑分离
调用链
2.4 路由设计
- 静态路由
- 参数路由
- 路由修复
- 冲突路由以及优先级
- 匹配 HTTP 方法
- 多处理函数:方便添加中间件
青铜:map[string]handlers
黄金:前缀匹配树
站在巨人的肩膀上
2.5 协议层设计
抽象出合适的接口
2.6 网络层设计
网络模型
03. 性能修炼之道
3.1 针对网络库的优化
- go net
- netpoll
- netpoll with nocopy peek
- 分配足够大的 buffer
- 限制最大的 buffer size
不同网络库的优势
go net:流式友好、小包性能高
netpoll:中大包性能高、时间延迟低
3.2 针对协议的优化 – Headers 解析
取:
- 核心字段快速解析
- 使用 byte slice 存储
- 额外存储到成员变量中
舍:
- 普通 header 性能较低
- 没有 map 结构
3.3 针对协议的优化 – Header key 规范化
取:
- 超高的转化效率
- 比 net.http 提高40倍
舍:
- 额外的内存开销
- 变更困难
3.4 热点资源池化
取:
- 减少内存分配
- 提高了内粗复用
- 降低了 GC 压力
- 性能提升
舍:
- 额外的 Reset 逻辑
- 请求内有效
- 问题定位难度增加
04. 企业实践
-
追求性能
-
追求易用、减少误用
-
打通内部生态
-
文档建设、用户群建设
碎碎念:已经开始听不懂了,很多关于计算机网络的知识,一时半会是不懂得,也正常,先记下来,留个印象,总会派上用场的