当前位置: 首页 > article >正文

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. 企业实践

  • 追求性能

  • 追求易用、减少误用

  • 打通内部生态

  • 文档建设、用户群建设

碎碎念:已经开始听不懂了,很多关于计算机网络的知识,一时半会是不懂得,也正常,先记下来,留个印象,总会派上用场的


http://www.kler.cn/a/409505.html

相关文章:

  • jdk-VarHandle 翻译
  • GitLab/GitHub 多环境配置SSH密钥
  • 【C++】static修饰的“静态成员函数“--静态成员在哪定义?静态成员函数的作用?
  • C#里怎么样使用BinaryReader和BinaryWriter类?
  • SplatFormer: Point Transformer for Robust3D Gaussian Splatting 论文解读
  • 单片机_简单AI模型训练与部署__从0到0.9
  • oracle会话追踪
  • 七天掌握SQL--->第五天:数据库安全与权限管理
  • java实现小程序接口返回Base64图片
  • MySQL面试-1
  • 李继刚:提示词(Prompt)的本质是表达的艺术
  • 实战 | C#中使用YoloV8和OpenCvSharp实现目标检测 (步骤 + 源码)
  • Python|Pyppeteer实现自动获取eBay商品数据(26)
  • w054基于web的飘香水果购物网站的设计与实现
  • Windows Server 2022 Web2
  • DHCP服务器的安装与配置(Windows系统)
  • Unity 事件处理的几种方式
  • 【数据结构 | C++】并查操作
  • IDEA+Docker一键部署项目SpringBoot项目
  • 面试:请阐述MySQL配置文件my.cnf中参数log-bin和binlog-do-db的作用
  • git使用(二)
  • 如何解决pdf.js跨域从url动态加载pdf文档
  • 重构代码之将引用类型更改为值类型
  • H.265流媒体播放器EasyPlayer.js播放器提示MSE不支持H.265解码可能的原因
  • 信创改造 - TongRDS 替换 Redis
  • RedHat系统配置静态IP