三、HTTP框架
1.HTTP:称为超文本传输协议
协议中包含了请求行,请求头和请求体三个部分:
请求行中有方法名、URL、协议版本、状态码以及对状态码的描述;
请求头中有协议约定以及相关业务。
案例
func main(){
h := server.New()
h.POST("/sis",func(c.context.Context.ctx.*app.RequestContext){
ctx.Data(200,"text/plain;charest = utf-8",[]byte("OK"))
})
h.Spin()
}
协议的主要架构自上而下未:业务层、服务治理层、路由层、协议编码层、传输层。
HTTP协议也存在着一些不足,如HTTP1存在着队头阻塞、传输效率低、明文传输不安全的缺点;
HTTP2存在着多路复用、头部压缩、二进制协议的不足。
2.HTTP框架的设计与实现:讲究专注性、扩展性与复用性,注重高内聚低耦合、易复用、高扩展
应用层设计:
提供较容易理解的API,具有冗余、兼容、可测、可见的特性。
中间件设计:
配合Handler实现一个完整的请求处理生命周期,拥有预处理和后处理逻辑;
可以注册多中间件,对上层模块用户逻辑模块易用。
路由设计:
路由实际上就是为URL匹配对应的处理函数,包括了静态路由、参数路由、路由修复、冲突路由以及优先级、还有匹配HTTP方法、多处理函数。
协议层设计:
根据方法,抽象出合适的接口:
type Server interface{
Serve(c context.Context, conn network.Conn) error
}
网络层设计:
网络模型设计:
BIO:
go func(){
for {
conn._ := listener.Accept()
go func(){
conn.Read(request)
handle...
conn.Write(response)
}()
}
}()
NIO:
go func(){
for {
readableConns,_ := Monitor(conns)
for conn := range readableConns{
go func(){
conn.Read(request)
handle...
conn.Write(response)
}()
}
}
}()
思考:
一个post请求在协议层做了什么?
- 建立连接: 在协议层,使用TCP协议来建立与服务器的连接。这包括使用三次握手进行连接的建立,确保双方可以进行可靠的数据传输。
- 构建请求头: 客户端构建HTTP请求头,包括请求方法(POST)、目标URL路径和HTTP协议版本(如HTTP/1.1)等。
- 构建请求体: 对于POST请求,数据位于请求体中。客户端根据需要构建请求体,可以是表单数据、JSON、XML等。
- 发送请求: 客户端使用TCP连接将构建的HTTP请求发送到服务器。这涉及将请求头和请求体打包成数据包,并通过网络发送给服务器。
- 接收请求: 服务器在协议层接收到来自客户端的请求。这包括从网络中接收数据包,然后拆解出请求头和请求体。
- 处理请求体: 如果请求包含数据,服务器在协议层会解析请求体中的数据,进行验证、转换和处理。
- 执行操作: 服务器根据请求的内容和目的执行相应的操作,可能是存储数据、更新资源等。
- 构建响应: 服务器构建HTTP响应,包括响应状态行、响应头和响应体。
- 发送响应: 服务器将构建的HTTP响应通过TCP连接发送回客户端。
- 接收响应: 客户端在协议层接收服务器发送的响应。这涉及从网络中接收数据包,然后拆解出响应头和响应体。
- 处理响应: 客户端根据响应的内容在协议层执行相应的操作,解析响应体中的数据,并根据应用程序逻辑处理。
- 断开连接: 通信完成后,可以选择在协议层上关闭TCP连接,释放相关资源。