Web 框架 Gin | Gin快速入門

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








1、Gin 概述

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

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

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

    中間件支持

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

    Crash 處理

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

    JSON 驗證

    Gin 可以解析和驗證請求的 JSON,例如檢查有個必須值是否存在。

    路由分組

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

    錯誤管理

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

    內(nèi)置渲染

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

    可擴展

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

1.2 應(yīng)用舉例

以下項目都是使用 Gin 框架開發(fā)的:

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






2、快速入門
2.1 安裝

    準備 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對象
       g := gin.Default()

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

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

      
    go mod 導入依賴

    項目 gin-demo 目錄下,執(zhí)行 go mod init gin-demo 和 go mod tidy 命令完成依賴導入,將自動生產(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

      

    運行

    gin-demo 目錄執(zhí)行命令 go run gin.go 啟動 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
        

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

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

3、總結(jié)

Gin 的入門很簡單,簡單幾行代碼就可以啟動一個 Web Server,并且還有非常完善的組件等,接下來的文章將會對其一些細節(jié)展開具體說明。