Go_4_HTTP| 青训营

63 阅读5分钟

HTTp 框架

这不巧了, 刚看完 网络框架, 就来了 http框架, 只是讲的基础知识, 没有具体的实现 突然发现这个md编辑器还挺好用, 不过我永远只爱typora

超文本传输协议

  • 请求行/状态行
    • 方法名
    • URL
    • 协议版本
  • 请求头/响应头
  • 请求体/响应体
POST /sis HTTP/1.1
Who: Alex 
Content-Type: text/plain 
Host: 127.0.0.1:8888
Content-Length: 28
Let's watch a movie together

问题与展望

  • HTTP1 队头阻塞, 传输效率低, 明文传输不安全 (头部太大)
  • HTTP2 多路复用, 头部压缩, 二进制协议
  • QUIC 基于UDP实现, 解决队头阻塞加, 密减少握手次数, 支持快速启动

盖尔定律

一个切实可行的复杂系统势必是从一个切实可行的简单系统发展而来的。从头开始设计的复杂系统根本不切实可行,无法修修补补让它切实可行。你必须由一个切实可行的简单系统重新开始。

run起来, 再考虑复用, 使用迭代的方式进行

合理的 API

不要试图在文档中说明,很多用户不看文档, 这也是在说: 代码的自注释性

  • 可理解性:如ctx.Body(),ctx.GetBody(),不要用ctx. BodyA()
  • 简单性:如ctx.Request. Header.Peek(key) /ctx. GetHeader(key)
  • 冗余性
  • 兼容性
  • 可测性
  • 可见性

洋葱模型

适用场景:

  • 日志记录
  • 性能统计
  • 安全控制
  • 事务处理
  • 异常处理

什么是 Handler

在计算机编程和软件开发中,Handler(处理器)是指用于处理特定事件或请求的代码块、函数或对象。它充当了一个中间人,接收来自外部系统或其它组件的事件或请求,并对其进行适当的处理和响应。

Handler 的主要任务是根据接收到的事件或请求的类型,执行相应的逻辑。它可以包括各种操作,如数据处理、错误处理、用户界面更新、网络通信、数据库查询等。

Handler 可以存在于不同的上下文中。例如,对于图形用户界面(GUI),一个按钮点击事件的处理者就是一个 Handler;在服务端开发中,一个 HTTP 请求的处理者也可以被称为 Handler。它们根据特定的事件或请求类型,执行相应的操作以满足需求。

在许多框架和库中,一般会有一套明确定义的规则和接口来定义和使用 Handler。这些规则和接口可以使开发人员更方便地定义和注册 Handler,并将其与相应的事件或请求关联起来。

还记得 muduo中的 eventhandler

框架路由实际上就是为URL匹配对应的处理函数(Handlers)

  • 静态路由:/a/b/c./a/b/d
  • 参数路 :/a/:id/c(/a/b/c,/a/d/c)./*all
  • 路由修复:/a/b<->/a/b/
  • 冲突路由以及优先级:/a/b./:id/c
  • 匹配HTTP方法
  • 多处理函数:方便添加中间件

如何匹配HTTP方法

该部分需要补档

开发流程

  • 1.明确需求:考虑清楚要解决什么问题,有哪些需求
  • 2.业界调研:业界都有哪些解决方案可供参考
  • 3.方案权衡:思考不同方案的取舍
  • 4.方案评审:相关同学对不同方案做评审
  • 5.确定开发:确定最合适的方案进行开发
type Server interface{
	Serve(c context. Context, conn network.Conn) error
}


type Conn interface {
    Read(b []byte)(n int, err error)
    Write(b []byte)(n int, err error)
}

字节内部网络模型

总结

  • API设计:可理解性、简单性
  • 中间件设计: 洋葱模型
  • 路由设计:前缀匹配树
  • 协议层设计:抽象出合适的接口
  • 网络层设计: 网络模型

设计点

  • 存下全部Header
  • 减少系统调用次数
  • 能够复用内存
  • 能够多次读
type Reader interface {
    // 开始读的位置
    Peek(n int)([]byte, error)
    Discard(n int)(discarded int, err error)
    Release() error 
    Size() int 
    Read(b []byte)(l int, err error)
}

网络库比较

  • go net 流式友好, 小包性能高
  • netpoll 中大包性能高, 时延低

针对协议的优化

  • 找到Header Line边界:\r\n, 先找到\n再看它前一个是不是\r
  • 热点资源池化

针对协议相关的Headers

  • 1.通过 Header key 首字母快速筛除掉完全不可能的 key
  • 2.解析对应 value到独立字段
  • 3.使用 byte slice 管理对应 header 存储,方便复用请求体中同样处理的Key: User-Agent、 Content-Type、 Content-Length、 Connection、 Transfer-Encoding

开源 json 库

SIMD技术

SIMD(Single Instruction, Multiple Data)是一种并行计算的技术,它在同一时间执行相同的指令来处理多个数据元素。它是在计算机体系结构中用于向量化操作的一种方式。

传统的计算机指令集架构(ISA)以标量方式执行指令,即每次执行一个指令处理一个数据元素。而 SIMD 架构通过引入特殊的寄存器和指令集,能够同时处理多个数据元素,加速并行计算。

SIMD 技术适用于那些可以被划分为多个独立任务的数据,并且这些任务可以并行地进行相同的计算。它可以提高多媒体处理、图形渲染、信号处理、科学计算等应用的性能。

SIMD 指令集提供了一系列的指令,用于在单个时钟周期内同时对多个数据进行相同的操作。这些指令可以一次性处理多个数据元素,例如同时对四个浮点数执行加法操作。

常见的 SIMD 指令集包括 Intel 的 SSE(Streaming SIMD Extensions)、AMD 的 3DNow!、ARM 的 NEON 等。这些指令集通常有不同的版本,支持不同的宽度(如 128 位、256 位)和数据类型(如整数、浮点数)。

使用 SIMD 技术可以显著提高计算性能,但需要合理的程序设计和优化以充分利用 SIMD 指令集的并行计算能力。许多编程语言和编译器提供了对 SIMD 的支持,使得开发者能够方便地利用 SIMD 技术来加速计算。

性能不是全部

  • 追求性
  • 追求易用, 减少误用
  • 打通内部生态
  • 文档建设、用户群建设,