lxmhhy

场景需求

数据库存储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

相关文章: