场景需求

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

【Gin-API系列】需求设计和功能规划(一)的更多相关文章

  1. Web API系列(一)设计经验与总结

    在移动互联网的时代, Web服务已经成为了异构系统之间的互联与集成的主要手段,各种 Web服务几乎都采用REST风格的Web Api来构建. 通过Http协议的形式来. 以Get/Post方式发送请求 ...

  2. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  3. Web API系列(二)接口安全和参数校验

    以前简单介绍过web api 的设计,但是还是有很多朋友问我,如何合理的设计和实现web api.比如,接口安全,异常处理,统一数据返回等问题.所以有必要系统的总结总结 web api 的设计和实现. ...

  4. 构建NetCore应用框架之实战篇(三):BitAdminCore框架功能规划选择

    本篇承接上篇内容,如果你不小心点击进来,建议从第一篇开始完整阅读,文章内容继承性连贯性. 构建NetCore应用框架之实战篇系列 一.BitAdminCore功能规划 如何选择框架的落地功能,前篇文章 ...

  5. 【开源】OSharp3.0框架解说系列:新版本说明及新功能规划预览

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  6. Web API系列之三 基本功能实现

    Web API系列之二讲解了如何搭建一个WebApi的基架,本文主要在其基础之上实现基本的功能.下面开始逐步操作: 一.配置WebApi的路由-用于配置外部如何访问内部资源的url的规则 1.添加Gl ...

  7. dubbo-go 的开发、设计与功能介绍

    dubbo-go 的前世今生 dubbo-go 是目前 Dubbo 多语言生态最火热的项目.dubbo-go 最早的版本应该要追溯到 2016 年,由社区于雨同学编写 dubbo-go 的初版.当时很 ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  9. 需求存在,功能存在——Alpha阶段性总结

    0.Alpha开发成果 题士Alpha发布报告 题士开发记录 1.任务划分 Alpha阶段大致将任务划分为Design,Develop和Test三类 Design型任务包含页面UI设计和接口API设计 ...

随机推荐

  1. js语法基础入门(5.2)

    5.2.循环结构 当一段代码被重复调用多次的时候,可以用循环结构来实现,就像第一个实例中出现的场景一样,需要重复询问对方是否有空,这样就可以使用循环结构来搞定 5.2.1.for循环语句 //语法结构 ...

  2. MyEclipse 选中属性或方法后 相同的不变色

    myeclipse-->windows-->java-->Editor-->content Assist-->Mark Occurrencmyeclipse-->w ...

  3. STL标准函数库学习小总结

    浅谈STL(未完)前言:(1)学习资料——<算法笔记>第六章.<常用基础数据结构>文档 (2)测试平台——Codeup新家(<算法笔记>对应OJ).洛谷.YCOJ ...

  4. C++ ACE 动态加载链接库

    添加头文件 #include <ace/DLL.h> #include <ace/DLL_Manager.h> 定义函数接口 typedef long (*PFN_TEST)( ...

  5. WSL中文本地化

    WSL中文本地化 Windows Subsystem for Linux(简称WSL)是一个在Windows 10上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层.它是由微软与Canon ...

  6. Django---进阶16<XSS攻击>

    目录 后台管理 添加文章 kindeditor富文本编辑器 编辑器上传图片 修改用户头像 bbs项目总结 后台管理 """ 当一个文件夹下文件比较多的时候 你还可以继续创 ...

  7. [SpringBoot]SpringBoot中使用redis事务

    本文基于SpringBoot 2.X 事务在关系型数据库的开发中经常用到,其实非关系型数据库,比如redis也有对事务的支持,本文主要探讨在SpringBoot中如何使用redis事务. 事务的相关介 ...

  8. day39 作业

    实现生产消费原理 from multiprocessing import Process,JoinableQueue import time import random def cooker(q): ...

  9. java 基本语法(十三) 数组(六)数组的常见异常

    1.数组角标越界异常:ArrayIndexOutOfBoundsException int[] arr = new int[]{1,2,3,4,5}; // for(int i = 0;i <= ...

  10. Zabbix 4.0 API 实践,主机/主机群组 批量添加模板和删除模板

    场景 我们日常在管理Zabbix 的时候,经常会需要批量添加模板和批量删除模板,Zabbix页面是提供的批量链接的功能,但是它链接的也只是当前页的主机,我们想扩展这个功能,在链接的时候,可以批量链接整 ...