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ō)明。