Web 框架 Gin | Gin快速入門(mén)

作者:xcbeyond
瘋狂源自夢(mèng)想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專注后端開(kāi)發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂(lè)于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫(kù)、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。 








1、Gin 概述

Gin 是一個(gè)基于 Go 語(yǔ)言編寫(xiě)的 Web 框架,與 martini 框架類似,但擁有更好的性能,借助高性能的 httprouter,速度提升了近 40 倍。如果你追求高性能和開(kāi)發(fā)效率,你會(huì)愛(ài)上 Gin 框架。

在這里插入圖片描述
1.1 功能特性

    快速
        基于Radox樹(shù)(一種更節(jié)省空間的 Trie 樹(shù)結(jié)構(gòu))的路由,內(nèi)存占用更小。
        沒(méi)有反射。
        可預(yù)測(cè)的 API 性能。

    中間件支持

    傳入的 HTTP 請(qǐng)求可以由中間件鏈和最終操作處理。例如:Logger、Authorization、GZIP 以及最終的 DB 操作。

    Crash 處理

    Gin 框架可以捕獲一個(gè)發(fā)生在 HTTP 請(qǐng)求中的 panic 并 recover 它,從而保證服務(wù)器始終可用。此外,你還可以向 Sentry 報(bào)告這個(gè) panic!

    JSON 驗(yàn)證

    Gin 可以解析和驗(yàn)證請(qǐng)求的 JSON,例如檢查有個(gè)必須值是否存在。

    路由分組

    支持通過(guò)路由分組來(lái)更好地組織路由,例如是否需要授權(quán)、設(shè)置 API 的版本等,此外,這些分組可以無(wú)限制地嵌套而不會(huì)降低性能。

    錯(cuò)誤管理

    Gin 框架提供了一種方便的機(jī)制來(lái)收集 HTTP 請(qǐng)求期間發(fā)生的所有錯(cuò)誤,并且最終通過(guò)中間件將它們寫(xiě)入日志文件、數(shù)據(jù)庫(kù)或者通過(guò)網(wǎng)絡(luò)發(fā)送到其它系統(tǒng)。

    內(nèi)置渲染

    Gin 框架提供了簡(jiǎn)單易上手的 API, 來(lái)返回 JSON、XML 或者 HTML 格式的響應(yīng)。

    可擴(kuò)展

    我們將會(huì)在后續(xù)示例代碼中看到 Gin 框架非常容易擴(kuò)展。

1.2 應(yīng)用舉例

以下項(xiàng)目都是使用 Gin 框架開(kāi)發(fā)的:

    gorush:Go 編寫(xiě)的通知推送服務(wù)器。
    fnproject:容器原生,云 serverless 平臺(tái)。
    photoprism:基于 Go 和 Google TensorFlow 實(shí)現(xiàn)的個(gè)人照片管理工具。
    krakend:擁有中間件的超高性能 API 網(wǎng)關(guān)。
    picfit:Go 編寫(xiě)的圖像尺寸調(diào)整服務(wù)器。
    gotify:基于 WebSocket 進(jìn)行實(shí)時(shí)消息收發(fā)的簡(jiǎn)單服務(wù)器。
    cds:企業(yè)級(jí)持續(xù)交付和 DevOps 自動(dòng)化開(kāi)源平臺(tái)。






2、快速入門(mén)
2.1 安裝

    準(zhǔn)備 Golang 環(huán)境

    安裝 Gin

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

2.2 示例

    創(chuàng)建示例工程目錄 gin-demo

    新建 gin.go 源文件:

    package main

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

    func main() {
       // 初始化gin對(duì)象
       g := gin.Default()

       // 設(shè)置一個(gè)get請(qǐng)求,其URL為/hello,并實(shí)現(xiàn)簡(jiǎn)單的響應(yīng)
       g.GET("/hello", func(c *gin.Context) {
          c.JSON(200, gin.H{
             "message": "hello world!",
          })
       })

       // 啟動(dòng)服務(wù)
       g.Run()
    }

      
    go mod 導(dǎo)入依賴

    項(xiàng)目 gin-demo 目錄下,執(zhí)行 go mod init gin-demo 和 go mod tidy 命令完成依賴導(dǎo)入,將自動(dòng)生產(chǎn) go.mod 、go.sum 文件。

    xcbeyond@xcbeyonddeMacBook-Pro gin-demo % go mod init gin-demo
    go: creating new go.mod: module gin
    go: to add module requirements and sums:
          go mod tidy
    xcbeyond@xcbeyonddeMacBook-Pro gin-demo % go mod tidy
    go: finding module for package github.com/gin-gonic/gin
    go: found github.com/gin-gonic/gin in github.com/gin-gonic/gin v1.7.3
    go: downloading github.com/stretchr/testify v1.4.0
    go: downloading github.com/go-playground/assert/v2 v2.0.1
       

    go.mod:

    module gin-demo

    go 1.16

    require github.com/gin-gonic/gin v1.7.3

      

    運(yùn)行

    gin-demo 目錄執(zhí)行命令 go run gin.go 啟動(dòng) gin Web Server:

    xcbeyond@xcbeyonddeMacBook-Pro gin-demo % go run gin.go
    [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

    [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
    - using env:   export GIN_MODE=release
    - using code:  gin.SetMode(gin.ReleaseMode)

    [GIN-debug] GET    /hello                    --> main.main.func1 (3 handlers)
    [GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
    [GIN-debug] Listening and serving HTTP on :8080
        

    此時(shí),Web Server 監(jiān)聽(tīng) 8080 端口,訪問(wèn) http://localhost:8080/hello, 則會(huì)響應(yīng):

    {"message":"hello world!"}
        1

3、總結(jié)

Gin 的入門(mén)很簡(jiǎn)單,簡(jiǎn)單幾行代碼就可以啟動(dòng)一個(gè) Web Server,并且還有非常完善的組件等,接下來(lái)的文章將會(huì)對(duì)其一些細(xì)節(jié)展開(kāi)具體說(shuō)明。