HTTP框架| 青训营

106 阅读3分钟

三、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请求在协议层做了什么?

  1. 建立连接: 在协议层,使用TCP协议来建立与服务器的连接。这包括使用三次握手进行连接的建立,确保双方可以进行可靠的数据传输。
  2. 构建请求头: 客户端构建HTTP请求头,包括请求方法(POST)、目标URL路径和HTTP协议版本(如HTTP/1.1)等。
  3. 构建请求体: 对于POST请求,数据位于请求体中。客户端根据需要构建请求体,可以是表单数据、JSON、XML等。
  4. 发送请求: 客户端使用TCP连接将构建的HTTP请求发送到服务器。这涉及将请求头和请求体打包成数据包,并通过网络发送给服务器。
  5. 接收请求: 服务器在协议层接收到来自客户端的请求。这包括从网络中接收数据包,然后拆解出请求头和请求体。
  6. 处理请求体: 如果请求包含数据,服务器在协议层会解析请求体中的数据,进行验证、转换和处理。
  7. 执行操作: 服务器根据请求的内容和目的执行相应的操作,可能是存储数据、更新资源等。
  8. 构建响应: 服务器构建HTTP响应,包括响应状态行、响应头和响应体。
  9. 发送响应: 服务器将构建的HTTP响应通过TCP连接发送回客户端。
  10. 接收响应: 客户端在协议层接收服务器发送的响应。这涉及从网络中接收数据包,然后拆解出响应头和响应体。
  11. 处理响应: 客户端根据响应的内容在协议层执行相应的操作,解析响应体中的数据,并根据应用程序逻辑处理。
  12. 断开连接: 通信完成后,可以选择在协议层上关闭TCP连接,释放相关资源。