Go Web框架 Gin

Gin是用Go(Golang)编写的Web框架。他是一个类似于 martini 但拥有更好性能的API框架,由于 httprouter,速度提高了40倍。如果您追求性能和高效的效率,您将会爱上Gin。

1.1 核心模块

(1) Engine

Engine 是 gin 框架的一个实例,它包含了多路复用器中间件和配置中心。(Engine 可以看做是 Beego 中 HttpServer 和 ControllerRegister 的合体)

  • 实现了路由树功能,提供了注册和匹配路由的功能
  • 它本身可以作为一个 Handler 传递到 http 包,用于启动服务器

Engine 的启动:

gin 通过 Engine.Run(addr ...string) 来启动服务,最终调用的是http.ListenAndServe(address, engine),其中第二个参数应当是一个 Handler 接口的实现,即 engine 实现了此接口:

func TestUserController_GetUser(t *testing.T) {
   g := gin.Default()
   ctrl := &UserController{}
   g.GET("/user/*", ctrl.GetUser)
   g.POST("/user/*", ctrl.CreateUser)

   g.GET("/static", func(context *gin.Context) {
      // 读文件
      // 谐响应
   })
   _ = g.Run(":8082")

}
复制代码

Engine.ServeHTTP() 会先初始化一个空的上下文,然后挂上请求 c.Reuqest = req,随后执行 engine.handlerHTTPRequest(c)(包含主要处理逻辑的函数)。

  • engine.handlerHTTPRequest() 会先设置处理一些配置项,如 UseRawPath、RemoveExtraSlash 等

  • 然后开始寻找路由,从 engine.trees 中寻找

  • 当找到后执行找到路由对应的处理链 .handlers

以上就是正常处理一个请求的主要逻辑, Engine 的路由树功能本质上是依赖于 methodTree 的。

(2) IRoutes

Engine 组合了 RouterGroup, RouterGroup 是对路由树的包装,所有的路由规则最终都是由它来进行管理, 因为 RouterGroup 实现了 IRouter 接口,IRouter 接口是 IRoutes 接口和 Group 函数组合而成。提供的是注册路由的抽象。它的实现类 Engine 类似 ControllerRegister

所以 Engine 直接具备了 RouterGroup 所有的路由管理功能,同时 RouteGroup 对象里面还会包含一个 Engine 的指针,这样 Engine 和 RouteGroup 就成了「你中有我我中有你」的关系。

  • IRoutes 接口定义了所有路由处理的实现方法。
    • Use 方法提供了用户接入自定义逻辑的能力,这个一般情况下也被看做是插件机制。

    • POST(relativePath string, handlers ...HandlerFunc) 调用了 handle() 方法,是在 Group 中加一个路由(相对地址)及处理函数链(很常用就不多说了,其他类似方法也略)。

    • Handle(method, relativePath string, handlers ...HandlerFunc) 方法相对于 POST()/GET() 等方法只是可以传入自定义的方法名,用于特殊的、不标准的、Gin 内置不存在的的请求方法(不常用)。

    • Any() 会将路由及函数处理链在所有的支持方法上都 copy 存储一份,以实现通过任何请求方法都会有同样的调用链。

    • StaticFile(relativePath, filePath) 会将路由映射到文件系统的某一文件上,此时的 relativePath 是不允许有变量存在的(不允许有 : 和 * )。内部通过 c.File() 响应此文件。

    • Static(relativePath, root string) 将路由映射到文件系统的某一个文件夹上,底层调用了 StaticFS(relativePath, Dir(root, false))

    • StaticFS() 类似 Static(),但自定义 http.FileSystem 了,FileSystem 就可以理解为一个目录,这个目录就是所谓的文件系统。gin 的实现为了安全禁用了目录中的 list 功能。

  • IRouter 接口定义了所有路由处理的实现方法以及一个分组方法(Group())。
    • Group() 方法,RouterGroup 通过 Group() 方法创建子分组,子分组会继承下来父 Group 的 handlers 并追加自己独有的 handlers,计算出此 Group 的 path 地址,及记录 Engine 地址。

Gin 没有 Controller 的抽象。所以在这方面我和 Gin 的倾向比较一致,即 MVC 应该是用户组织 Web 项目的模式,而不是我们中间件设计者要考虑的。

(3) methodTrees 和 methodTree

Gin 在 Engine 结构体中定义了 methodTrees, 实际上它代表的是森林, 即每一种 http 方法都对应到一颗路由树。

methodTrees 是一种 methodTree 类型的切片,而 methodTree才是真实的路由树,代表位于 Gin 路由结构顶端的方法树,它含有两个属性 methodroot,其中method 属性表示请求的方法类型,如:GETPOSTPUT 等,而 root 属性则指向对应路由树的根节点。

(4) HandlerFunc 和 HandlersChain

从源代码中给的注释,我们可以知道 RouterGroup 在 Gin 内部用于配置路由器,其与前缀处理函数(中间件)数组相关联

HandlerFunc 定义了核心抽象——处理逻辑。 在默认情况下, 它代表了注册路由的业务代码。

HandlersChain 是一个 HandlerFunc 类型的切片,可以理解为构造了责任链模式

(5)Context

gin.Context内保存了请求的上下文信息,是所有请求处理器的入口参数, 提供了丰富得API:

  • 处理请求的 API,代表的是以 Get 和 Bind 为前缀的方法
  • 处理响应的 API,例如返回 JSON 或者 XML 响应的方法
  • 渲染页面,如 HTML 方法

1.2 总结

优点

  • 支持路由分组
  • 运行速度快
  • 更好的支持 middleware 和 json
  • 灵活性更好(封装程度不如 beego 高), 也可以说是更轻量的框架

缺点

  • 相比于 beego 更轻量,那么也就没有像 beege 那样提供更多的 api

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值