【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM