【Gin-API系列】需求設計和功能規劃(一)
- 2020 年 7 月 27 日
- 筆記
- gin, golang, Golang-Gin-API
場景需求
資料庫存儲2個模型,每個模型都有一個或多個IP欄位,需要通過 Golang Http Api(Restful Api) 返回 IP 資訊。
- 模型1 – 伺服器
ID | 主機名 | IP | 記憶體大小 | 磁碟大小 | 類型 | 負責人 |
---|---|---|---|---|---|---|
H001 | 10-1-162-18 | 10.1.162.18 | 32G | 2T | 物理機 | 小林 |
H002 | 10-1-162-19 | 10.1.162.19 | 32G | 2T | 物理機 | 小黃 |
… |
- 模型2 – 交換機
ID | 設備名 | 管理IP | 虛IP | 帶外IP | 廠家 | 負責人 |
---|---|---|---|---|---|---|
S001 | 上海集群交換機 | 10.2.32.11 | 10.2.20.1,10.2.20.13,10.1.162.18 | 10.3.32.11 | 華為 | 老馬 |
S002 | 廣州集群交換機 | 10.2.32.13 | 10.2.21.5,10.2.21.23,10.2.21.40 | 10.3.32.13 | 思科 | 老馬 |
… |
需求詳情
使用 Golang 開發一個 Api Server,支援通過 http 請求返回目標 IP 的部分資訊
-
請求方法
支援
GET/POST
請求 -
入參
支援多個IP參數同時查詢
-
輸出
ip對應的設備資訊和負責人資訊
-
案例請求
GET /test/search_ip?ip="10.1.162.18,10.1.162.19"
POST /test/search_ip -d '{"ip":"10.1.162.18,10.1.162.19"}
-
案例響應
[
{"10.1.162.18":{
"_match": "ip", // 匹配到的欄位名稱
"model":"伺服器", // 設備類型
"ip":"10.1.162.18", // ip
"owner":"小林", // 負責人
"hostname": "10-1-162-18", // 主機名
}
},
{"10.1.162.19":{
"_match": "ip",
"model":"伺服器",
"ip":"10.1.162.19",
"owner":"小黃",
"hostname": "10-1-162-10",
}
},
{"10.1.162.18":{
"_match": "vip", // 匹配到的欄位名稱
"model":"交換機", // 設備類型
"ip":"10.2.32.11", // 管理IP
"vip":"10.2.20.1,10.2.20.13,10.1.162.18", // 虛IP
"console_ip":"10.3.32.11", // 帶外IP
"owner":"老馬", // 負責人
"name":"上海集群交換機", // 設備名
}
}
]
初步操作
- 框架選取
目前 golang 比較常用的 api 框架有 beego,gin,iris,echo,martini 等,在選用之前我們可以花10分鐘在知乎、Github上調研下各框架的優劣性,其中可以選取 Github Star 數量,百度搜索熱度等作為參考點比較。
本次項目我們採用輕量級的 Gin 作為開發框架,特點是簡單易用,高性能、易擴展,在中小型項目應用較多。
Gin 在 golang 中的地位就像是 python 中的 flask。
- 簡單驗證可行性
新建 golang 項目, Gin-IPs. 新建 src/main.go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"os"
)
func main() {
route := gin.Default()
route.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"10.1.162.18": map[string]string{"model": "主機", "IP": "10.1.162.18"},
})
})
if err := route.Run("127.0.0.1:8080"); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
啟動:
go run src/main.go
驗證:
curl //127.0.0.1:8080/
結果:
{"10.1.162.18":{"IP":"10.1.162.18","model":"主機"}}
Windows 編碼:如果在 windows 出現亂碼,則可以在 cmd 終端運行
chcp 65001
設置utf8
編碼
功能規劃
通過簡單的
main
函數驗證,我們可以確認該框架基本符合我們的需求,接下來是進行 Gin-IPs 的功能和大概的目錄規劃,捋清整個項目的思路。
- 模組清單
* 路由綁定 // 快捷、自動生成路由 URI
* 請求參數檢查 // 綁定請求參數並檢查
* 響應規範 // 統一、規範的返回資訊
* 路由中間件
* 簽名驗證 // API 安全認證
* 日誌 // 請求日誌
* 異常捕捉 // 請求異常捕捉
* 鏈路跟蹤 // 請求鏈路跟蹤
* 資料庫 // 資料庫操作
* 非同步請求 // 耗時操作快速響應
* 部署 // 上線部署
* 監控 // 服務監控
- 目錄規劃
Gin-IPs/
├── bin // 二進位文件、啟動/停止腳本
├── conf // 配置文件目錄
├── logs // 日誌文件目錄
├── src // 程式碼文件目錄
│ ├── configure // 配置文件解析
│ ├── controller // Api 控制器,啟動/重載 gin server
│ ├── dao // 資料庫操作
│ ├── exception // 異常定義
│ ├── main.go // 主函數入口
│ ├── route // 路由目錄,包括路由綁定、中間件
│ ├── service // 具體的業務處理邏輯
│ ├── utils // 工具函數集合
│ └── watcher // 監控上報
└── test // 測試目錄
接下來,我們就可以有計劃地推進 Gin-Ips 開發了。
Github 程式碼
請訪問 Gin-IPs 或者搜索 Gin-IPs