【Gin-API系列】需求设计和功能规划(一)

场景需求

数据库存储2个模型,每个模型都有一个或多个IP字段,需要通过 Golang Http Api(Restful Api) 返回 IP 信息。

  • 模型1 - 服务器
ID主机名IP内存大小磁盘大小类型负责人
H00110-1-162-1810.1.162.1832G2T物理机小林
H00210-1-162-1910.1.162.1932G2T物理机小黄
...
  • 模型2 - 交换机
ID设备名管理IP虚IP带外IP厂家负责人
S001上海集群交换机10.2.32.1110.2.20.1,10.2.20.13,10.1.162.1810.3.32.11华为老马
S002广州集群交换机10.2.32.1310.2.21.5,10.2.21.23,10.2.21.4010.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 mainimport ( "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

相关文章