HTTP | 青训营笔记

60 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第 4 篇笔记

HTTP

1.HTTP 协议

HHTP是什么:超文本传输协议

1.1为什么要有协议

需要知道明确的边界 (什么时候开始,什么时候结束) 携带信息(什么消息 什么类型等)

1.2一个协议有什么

方法名 URL 协议版本 请求行/状态行 协议版本 状态码 状态描述
协议约定 业务相关 请求头/回应头 协议约定 业务相关
请求体/回应体

方法名 GET POST PUT TRACE PATCH
状态码 1XX 消息类 2XX成功
3XX重定向 4XX客户端错误 5XX 服务端错误

1.3请求流程

业务层 服务治理层 路由层 协议编(解)码层 传输层

1.4不足展望

HTTP1 不足(基于TCP)队头阻塞 传输效率低 明文传输不安全
不能多路复用
HTTP2 解决了一部分 可以多路复用 头部压缩 二进制协议(解析高效) 不足 没有解决队头阻塞
QUIC 基于UDP实现的 解决了队头阻塞问题 加密减少握手次数 支持快速启动

2应用层设计

image.png

2.1 API

可理解性 如 ctx.Body() ctx.GetBody() 简单性 如ctx.Request.Header.Peek(key)

冗余性 兼容性 可测性 可见性

2.2中间件设计

2.3路由设计

框架上路由实际上就是 URL 匹配对应的处理函数
静态路由 /a/b/c ; /a/d/c
参数路由 /a/:id/c , 匹配的是/a/(b.d)/c ; /a/b/* all 匹配的是 /a/b/后面所有
路由修复 /a/b <-> /a/b/
冲突路由以及优先级
匹配HTTP方法
多处理函数 list 储存函数

2.3.1 路由匹配

一 用map 储存 map[string]handlers
二 前缀匹配树

2.3.1匹配HTTP方法

3性能优化

3.1 网络库的优化

3.1.1go net 流式友好,小包性能好
存下全部的Header
减少系统调用次数
能够复用内存
能够多次读

go net with bufio
绑定一块缓存区

3.1.2 netpool 中大包性能好 ,时延低 存下全部的 Header
拷贝完整的 Body

网络管理的一个 Link-buff 来储存信息,但是出现一个问题,会跨节点储存信息
要拷贝到一个完整的内存进行解析;我们可以优化

我们通过底层分配足够的 Buffer 来储存每个信息,使用节点的切片

3.2 协议的优化