场景需求

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

最新文章

  1. block的常见用法
  2. 我刚知道的WAP app中meta的属性
  3. JS实现的一个query字符串转Json格式数据的方法
  4. OI总结(垃圾排版就忽略了吧)
  5. MVC系列1-MVC基础
  6. 20150912华为机考1之"输入一个字符串,将其中出现次数最多的字符输出"
  7. 卷积神经网络CNN全面解析
  8. XSS 前端防火墙(2):可疑模块拦截
  9. 7.使用ProcessBuilder执行本地命令(转)
  10. response的contentType 几种类型
  11. Linux环境g++编译TinyXML动态库
  12. HashMap 和 HashTable 区别
  13. iOS----------弹窗动画
  14. 透彻掌握Promise的使用
  15. Flutter之MaterialApp使用详解
  16. MyBatis 源码分析 - 缓存原理
  17. Thinking in Java Chapter 14
  18. [NOIP2018]保卫王国
  19. 【4】 .net MVC使用Session验证用户登录
  20. BZOJ 4720 [Noip2016]换教室

热门文章

  1. js语法基础入门(5.1)
  2. 为什么 group by后面 必须跟selecte 后面的除了聚集函数外的所有字段
  3. nginx 注释配置及详解
  4. CSS中那些必须掌握的概念
  5. Spring Security(一) —— Architecture Overview
  6. Centos7安装docker与docker-compose
  7. String类、static关键字、Arrays类、 Math类的一些学习心得
  8. LeetCode 81,在不满足二分的数组内使用二分法 II
  9. 第三方 CSS 并不安全
  10. Chive CTF 2020 - Tiki