Gin-Web-Framework官方指南中文(上篇)

  • 2019 年 10 月 30 日
  • 筆記

英文文档

GitHub

一、介绍

Gin是什么?

Gin是一个用Golang写的HTTP web框架。它具有类似于Martini的API,性能更高-快40倍。 如果需要很好的性能,那么肯定是推荐现在使用Gin。

特点:

快:

基于基数树的路由,占用内存少。 没有反射。 可预测的API性能

中间件支持:

进来的HTTP请求被中间件链处理然后最后执行。举个例子比如日志,鉴权,解压等行为拦截操作之后,将信息发送到DB

奔溃无影响:

gin能捕获在HTTP请求的异常并且恢复,通过这种方式,你的服务可以保证高可用,作为一个例子,他可以提供上报异常监控

JSON校验:

Gin能解析并且校验请求中的JSON,比如校验某些必填入值

路由分组:

更好路由,鉴权必要或者非必要,不同的API版本,另外,分组可以无限嵌套并且对性能不会造成影响

错误管理:

Gin提供了一个便利的方式去收集所有的错误发生在HTTP请求中的,最后一个中间件可以写他们到一个日志文件或者一个数据库并且通过网络发送传输。

内置渲染:

Gin提供了一个简单实用渲染的JSON、XML和HTML的方式

可扩展性:

创建一个新的中间件非常容易,仅仅是看看示例代码就能明白。

二、快速开始入门

前提条件:

go的版本1.9+,未来不再支持1.7或者1.8

安装:

首先是建立在已经安装golang和设置好了你的工作目录空间。

这里需要注意的一点是所有通过go下载的GitHub内容都在$GOPATH/src/github.com目录下

下载安装gin

 go get -u github.com/gin-gonic/gin

代码引入包

import "github.com/gin-gonic/gin"

可选项,如果需要使用http.StatusOK

import "net/http"

初始化本地仓库

使用一个vendor工具比如Govendor

 go get github.com/kardianos/govendor

创建项目文件夹并且打开

mkdir -p $GOPATH/src/github.com/myusername/project && cd "$_"  

使用vendor初始化你的项目并且添加gin框架(如果这个时候报错找不到你的govendor,则你需要先执行一个命令行设置下你的执行gopath环境目录)

export PATH=$PATH:$(go env GOPATH)/bin
govendor init  govendor fetch github.com/gin-gonic/[email protected]

复制一个项目模板到项目(很可能会504网关超时)

curl https://raw.githubusercontent.com/gin-gonic/examples/master/basic/main.go > main.go

运行项目

go run main.go

开始入手项目

创建一个go 文件比如example.go

touch example.go

内容写入以下代码

package main    import "github.com/gin-gonic/gin"    func main() {  	r := gin.Default()  	r.GET("/ping", func(c *gin.Context) {  		c.JSON(200, gin.H{  			"message": "pong",  		})  	})  	r.Run() // listen and serve on 0.0.0.0:8080  }

然后运行代码,命令行

go run example.go

或者Goland

三、基准测试

可以参考指标-测试结果

Gin的默认的JSON包encoding/json

如果想用其他的jsoniter,可以

go build -tags=jsoniter . 

四、如何发布

Rendor发布

Google App Engine发布

参考文档

五、测试:如何写测试用例

使用net/http/httptest包来测试HTTP请求

假设你的代码服务

package main    func setupRouter() *gin.Engine {  	r := gin.Default()  	r.GET("/ping", func(c *gin.Context) {  		c.String(200, "pong")  	})  	return r  }    func main() {  	r := setupRouter()  	r.Run(":8080")  }

测试代码命名xxx_test.go

package main    import (  	"net/http"  	"net/http/httptest"  	"testing"    	"github.com/stretchr/testify/assert"  )    func TestPingRoute(t *testing.T) {  	router := setupRouter()    	w := httptest.NewRecorder()  	req, _ := http.NewRequest("GET", "/ping", nil)  	router.ServeHTTP(w, req)    	assert.Equal(t, 200, w.Code)  	assert.Equal(t, "pong", w.Body.String())  }