HTTP框架修炼之道 | 青训营

105 阅读4分钟

HTTP——框架

超文本传输协议:(Hypertext Transfer Protocol)。 在 Go 语言中,有许多用于构建 Web 应用程序的 HTTP 框架和库。以下是一些常见的 Go HTTP 框架和库,它们可以构建强大的 Web 应用程序:

  1. Gin

    • Gin 是一个轻量级且高性能的 HTTP 框架,它提供了快速的路由和中间件支持。Gin 的设计灵感来自于 Martini,但它比 Martini 更快速和功能更丰富。
    • GitHub 地址:github.com/gin-gonic/g…
  2. Echo

    • Echo 是一个小巧且高性能的 HTTP 框架,它专注于简化 Web 应用程序的开发过程。Echo 具有快速的路由、中间件支持和 WebSockets 功能。
    • GitHub 地址:github.com/labstack/ec…
  3. Beego

    • Beego 是一个全功能的 MVC 框架,它提供了路由、ORM、模板引擎、会话管理等功能。Beego 旨在帮助开发者构建可伸缩的 Web 应用程序。
    • GitHub 地址:github.com/astaxie/bee…
  4. Chi

    • Chi 是一个轻量级的、快速的 HTTP 路由器,可以与其他 Go HTTP 框架和库结合使用。它支持中间件、路由分组和灵活的路由定义。
    • GitHub 地址:github.com/go-chi/chi
  5. Fiber

    • Fiber 是一个高性能的 Web 框架,它的设计目标是与 Express.js 类似。Fiber 具有快速的路由、中间件支持和异步请求处理。
    • GitHub 地址:github.com/gofiber/fib…
  6. Iris

    • Iris 是一个功能强大的 Web 框架,它支持路由、中间件、模板引擎和 WebSockets。Iris 提供了许多高级功能和工具,适用于大型 Web 应用程序。
    • GitHub 地址:github.com/kataras/iri…
  7. Buffalo

    • Buffalo 是一个用于构建现代 Web 应用程序的框架,它集成了多种工具和库,包括 ORM、前端构建工具、自动化代码生成等。
    • GitHub 地址:github.com/gobuffalo/b…

这些框架和库都有各自的特点和适用场景,可以根据项目需求选择合适的框架。无论选择哪个框架,都可以使用它们来快速搭建稳健的 Go Web 应用程序。

协议内容

常见方法名

  • GET
  • HEAD
  • POST
  • PUT
  • DELETE
  • CONNECT
  • OPTION
  • STRACE
  • PATCH

状态码

状态码:

  • 1xx:信息类
  • 2xx:成功
  • 3xx: 重定向
  • 4xx:客户端错误
  • 5xx:服务端错误

请求方法内容

  • 请求行/状态行

    • 请求行:方法名、URL、协议版本
    • 状态行:协议版本、状态码、状态码描述
  • 请求头/响应头

    • 业务相关内容
  • 请求体/响应体

HTTP框架设计

怎么设计?

  1. 明确需求:考虑清楚要解决什么问题、有哪些需求
  1. 业界调研:业界都有哪些解决方案可供参考
  1. 方案权衡:思考不同方案的取舍
  1. 方案评审:相关同学对不同方案做评审
  1. 确定开发:确定最合适的方案进行开发

分层设计

OSI参考模型

image.png 分层设计架构图

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

应用层
  • 提供合理API

    • 易理解
    • 简单
中间件
  • 配合Handler实现一个完整的请求处理生命周期

  • 拥有预处理逻辑与后处理逻辑

    • 相当于调用方法,AOP思想
  • 可以注册多中间件

  • 对上层模块用户逻辑模块易用

遵循洋葱模型:

image.png 模型适用创建:

  • 日志
  • 性能监控
  • 事务处理
  • 异常处理
路由设计

URI是URL的父级。

URL:完整的链接

URI:服务资源相对路径

框架路由实际上就是为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方法

路由映射表:

image.png

根据method进行http方法筛选。

协议层设计

抽象出合适的接口:

type Server interface{
    Serve(c context.Context, conn network.Conn) error
}
网络层设计
BIO

阻塞IO:如果未接收到信息,会一直等待。

执行逻辑:接收到连接请求过后,生成一个goRoutine去等待客户端响应(忙等)

go func(){
    for{
        conn,_ := listener.Accept()
        go func(){
            conn.Read(request)
            
            handler
            
            conn.Write(response)
        }
    }
}

go net

type Conn interface{
    Read
    Write
}
NIO

改进阻塞状态,注册监听器监听:

go func(){
    for{
        readableConns, _ := Monitor(conns)
        for conn := range readableConns{
            go func(){
                conn.Read(request)
​
                handler
​
                conn.Write(response)
            }
        }
 
    }
}

多路复用。

netpoll

type Reader interface{
    Peek(n int)
}
​
type Write interface{
    Malloc()
    Flush
}