1. 程式人生 > 實用技巧 >【Gin-API系列】需求設計和功能規劃(一)

【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 http://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