HTTP框架的设计与实现 | 青训营

86 阅读3分钟

简单介绍HTTP

HTTP是什么

HTTP是一种协议——超文本传输协议,基于TCP协议的应用层传输协议,用于客户端和服务端进行数据传输的一种规则。

HTTP内容

1.请求/状态行

  • 方法名
  • URL
  • 协议版本
  • 状态码
  • 状态码描述

2.请求/响应头

  • 协议约定
  • 业务相关

3.请求/响应头

HTTP 框架的设计与实现

分层设计

提高专注性、扩展性、复用性

分层作用设计
应用层与用户直接交互提供合理API
中间件层预处理配合Handler实现一个完整的请求处理生命周期;拥有预处理逻辑与后处理逻辑;可以注册多中间件;对上层模块用户逻辑模块易用
路由层为URL匹配对应的处理函数(Handlers)路由修复;处理冲突路由以及优先级;匹配HTTP方法;多处理函数(方便添加中间件)
协议层抽象出合适的接口
网路层(传输)层\网络模型

补充

路由层

1.路由有:静态路由(map、前缀匹配树)、参数路由(前缀匹配树) 2.匹配HTTP方法:外层map,根据method进行初步筛选 3.添加多处理函数:在每个节点上使用一个list存储函数

网络层

1.BIO:

  • BIO是阻塞输入输出(Blocking I/O)的缩写,是一种同步阻塞的I/O模型。
  • 在BIO模型中,当程序执行一个I/O操作时,它会被阻塞,直到操作完成才能继续执行后续的操作。 在BIO模型中,数据的读取和写入都是通过系统调用进行的,例如在Unix/Linux环境下的read()和write()函数。当程序调用这些函数进行I/O操作时,如果数据尚未准备好或无法立即写入,程序将被阻塞,直到数据就绪或写入完成为止。

举例:

type Conn interface{
    Read(b []byte) (n int, err error)
    Write(b []byte) (n int, err error)
    ...
 }
  • Read方法接受一个字节数组b作为参数,并返回实际读取的字节数n以及可能发生的错误err,可以读取一定量的数据并存储到字节数组中。
  • Write方法接受一个字节数组b作为参数,并返回实际写入的字节数n以及可能发生的错误err。通过调用Write方法,可以将字节数组中的数据写入到底层数据中。

如果底层无数据扔调用该接口,程序将会等待(符合设计要求的)数据到来才运行,否则可能超时、关闭。

2.NIO:

  • 非阻塞I/O(Non-blocking I/O),是一种在计算机编程中用于实现高性能的I/O操作的模型。
  • 与传统的阻塞I/O(BIO)模型不同,NIO模型的设计目标是通过将I/O操作从单独的线程中分离出来,实现在单个线程中处理多个并发连接或请求。这使得应用程序能够处理更多的连接,提高可伸缩性和性能。

举例:

type Reader interface{
    Peek(n int) ([]byte, error)
    ...
}
type Writer interface{
    Malloc(n int) (buf []byte, err error)
    Flush() error
    ...
}
type Conn interface{
    net.Conn
    Reader
    Writer
}
  • Reader接口传入的n指对底层传入数据的期望值,如果符合,才会唤醒后面程序。
  • Malloc 开辟n大小的空间拷贝数据到底层
  • Flush 调用后,发送数据

在达到设计要求的接收数据大小后,才会启用。