简单介绍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 调用后,发送数据
在达到设计要求的接收数据大小后,才会启用。