【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