gin框架分析一:框架结构概览

简介

Gin是一个用 Go (Golang) 编写的 web 框架,其速度快,简单易学,结构简单。

总体结构

主要类图

 gin框架核心为Engin类,其继承RouterGroup类并实现了GO标准库中的哦http.Handler接口并实现其中ServeHTTP函数作为框架对HTTP请求的处理入口;

 Context类提供对http.ResponseWriter,  http.Request的一个封装;

 node和methodTree构成gin框架的路由和相关处理器;

 Render接口的实现类完成对返回数据的不同渲染处理。

GIN基本组件

gin框架基本结构如下图:

 gin路由(trees)

图中trees为gin框架中的路由,其由methodTree构成为一个名为methodTrees的数组结构,其通过methodTree中的method字段分别对各种HTTP请求如POST、GET、DELETE等分类,并将对应路由构成树状结构:

源码中定义如下:

// method用于区分不同种类请求
type methodTree struct {
   method string
   root   *node
}

// 不同种类请求构成数组结构
type methodTrees []methodTree
trees            methodTrees 

 如上图所示,对于表中POST请求将构成图中的路由树结构,且对于请求“/mypost/a1”将会由"main.main.func6"方法处理。

 gin context

c := engine.pool.Get().(*Context)
c.writermem.reset(w)
c.Request = req
c.reset()

封装http.ResponseWriter,  http.Request。

render  

// Render interface is to be implemented by JSON, XML, HTML, YAML and so on.
type Render interface {
	// Render writes data with custom ContentType.
	Render(http.ResponseWriter) error
	// WriteContentType writes custom ContentType.
	WriteContentType(w http.ResponseWriter)
}

var (
	_ Render     = JSON{}
	_ Render     = IndentedJSON{}
	_ Render     = SecureJSON{}
	_ Render     = JsonpJSON{}
	_ Render     = XML{}
	_ Render     = String{}
	_ Render     = Redirect{}
	_ Render     = Data{}
	_ Render     = HTML{}
	_ HTMLRender = HTMLDebug{}
	_ HTMLRender = HTMLProduction{}
	_ Render     = YAML{}
	_ Render     = Reader{}
	_ Render     = AsciiJSON{}
	_ Render     = ProtoBuf{}
	_ Render     = TOML{}
)

render的实现类实现了对不同前端的渲染方式。

 engine

err = http.ListenAndServe(address, engine.Handler())

func (engine *Engine) Handler() http.Handler {
   if !engine.UseH2C {
      return engine
   }

   h2s := &http2.Server{}
   return h2c.NewHandler(engine, h2s)
}

 engin作为gin的核心,其实现http.Handler接口并实现ServeHTTP(ResponseWriter, *Request)的http.Handler函数作为gin框架入口,从而完成对原生net/http包的封装扩展。

HandlerFunc

// HandlerFunc defines the handler used by gin middleware as return value.
type HandlerFunc func(*Context)

// HandlersChain defines a HandlerFunc slice.
type HandlersChain []HandlerFunc

HandlerFunc作为gin中路由处理定义以及GIN中间件的定义,在处理具体的请求时将会获取对应的中间件机及处理函数去处理请求。

结论

整体上看gin框架比较简单易懂,其是对原生http.Server的扩展,通过GIN的分析可以明白一个基本的WEB框架如何去实现以及实现过程中的重点组成部分是什么。

posted @ 2023-01-24 15:35  一朵野生菌  阅读(975)  评论(0编辑  收藏  举报