這多是接下來一系列的文章的開始.git
使用 Gin 建立一個 web 項目.github
主要參考的是掘金小冊裏的 基於 Go 語言構建企業級的 RESTful API 服務.web
經過學習掘金小冊, 並加上本身的實踐, 完成一個完整的 Go Web 項目.api
新建一個項目, 並使用 go mod 初始化.跨域
go mod init tzh.com/web
複製代碼
由於這個項目不會發布到其餘地方, 也不會做爲依賴被使用, 因此 模塊路徑 是隨意選擇的.安全
添加對 Gin 的依賴.bash
go get -u github.com/gin-gonic/gin
複製代碼
第一部分是建立一個簡單的服務器, 主文件以下:服務器
package main
import (
"log"
"net/http"
"github.com/gin-gonic/gin"
"tzh.com/web/handler/check"
"tzh.com/web/router"
)
func main() {
// 初始化空的服務器
app := gin.New()
// 保存中間件
middlewares := []gin.HandlerFunc{}
// 路由
router.Load(
app,
middlewares...,
)
go func() {
if err := check.PingServer(); err != nil {
log.Fatal("服務器沒有響應", err)
}
log.Printf("服務器正常啓動")
}()
log.Printf("啓動服務器在 http address: %s", ":8080")
log.Printf(http.ListenAndServe(":8080", app).Error())
}
複製代碼
初始化了 Gin, 主要分爲兩步.app
第一步運行了 router.Load
函數, 裏面初始化了一些中間件, 以及一些檢查類的 API.框架
第二步經過一個 goroutine 檢查了服務器是否啓動成功, 其實我以爲這裏能夠加一個循環, 定時檢查服務器狀態.
當前定義的中間件, 主要是設置 Headers 的, 這個就要熟不熟悉常見的 Headers, 這部分我不太熟悉, 之前主要是靠框架自動設置的.
Options 仍是知道的, 添加跨域支持. 但對安全設置middleware.Secure()
, 真的是沒有研究.
// 載入中間件
func Load(g *gin.Engine, mw ...gin.HandlerFunc) *gin.Engine {
g.Use(gin.Logger())
g.Use(gin.Recovery())
g.Use(middleware.NoCache())
g.Use(middleware.Options())
g.Use(middleware.Secure())
g.Use(mw...)
g.NoRoute(func(ctx *gin.Context) {
ctx.String(http.StatusNotFound, "incorrect api router")
})
checkRoute := g.Group("/check")
{
checkRoute.GET("/health", check.HealthCheck)
checkRoute.GET("/disk", check.DiskCheck)
checkRoute.GET("/cpu", check.CPUCheck)
checkRoute.GET("/memory", check.MemoryCheck)
}
return g
}
複製代碼
接着設置了對 404 的響應.
gin.Group 是個好東西, 用於建立必要前綴, 或者分組都頗有用, 官方文檔裏的例子演示瞭如何用做 api 版本的區分.
這裏組織了一些檢查服務器狀態的 API, 主要使用 gopsutil 模塊獲取.
當前的內容就分析到這裏, 代碼見下面.
差很少是第一次寫一個完整的 Go 項目, 不得不說, 折騰編輯器就折騰很久了.
一開始老是有不少的不習慣和陌生, 仍是要多多接觸.
Go 的模塊如今還不是很成熟, gopls 的提示也不是很完美, 感受脫離了編輯器就不會寫代碼了.
做爲版本 0.1.0
雖然不是我寫的, 你們都能優惠, 也支持一下原做者.