【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
【Gin-API系列】需求设计和功能规划(一)的更多相关文章
- Web API系列(一)设计经验与总结
在移动互联网的时代, Web服务已经成为了异构系统之间的互联与集成的主要手段,各种 Web服务几乎都采用REST风格的Web Api来构建. 通过Http协议的形式来. 以Get/Post方式发送请求 ...
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
Redis总结(五)缓存雪崩和缓存穿透等问题 前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...
- Web API系列(二)接口安全和参数校验
以前简单介绍过web api 的设计,但是还是有很多朋友问我,如何合理的设计和实现web api.比如,接口安全,异常处理,统一数据返回等问题.所以有必要系统的总结总结 web api 的设计和实现. ...
- 构建NetCore应用框架之实战篇(三):BitAdminCore框架功能规划选择
本篇承接上篇内容,如果你不小心点击进来,建议从第一篇开始完整阅读,文章内容继承性连贯性. 构建NetCore应用框架之实战篇系列 一.BitAdminCore功能规划 如何选择框架的落地功能,前篇文章 ...
- 【开源】OSharp3.0框架解说系列:新版本说明及新功能规划预览
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- Web API系列之三 基本功能实现
Web API系列之二讲解了如何搭建一个WebApi的基架,本文主要在其基础之上实现基本的功能.下面开始逐步操作: 一.配置WebApi的路由-用于配置外部如何访问内部资源的url的规则 1.添加Gl ...
- dubbo-go 的开发、设计与功能介绍
dubbo-go 的前世今生 dubbo-go 是目前 Dubbo 多语言生态最火热的项目.dubbo-go 最早的版本应该要追溯到 2016 年,由社区于雨同学编写 dubbo-go 的初版.当时很 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
- 需求存在,功能存在——Alpha阶段性总结
0.Alpha开发成果 题士Alpha发布报告 题士开发记录 1.任务划分 Alpha阶段大致将任务划分为Design,Develop和Test三类 Design型任务包含页面UI设计和接口API设计 ...
随机推荐
- mybatis源码配置文件解析之五:解析mappers标签流程图
前面几篇博客分析了mybatis解析mappers标签的过程,主要分为解析package和mapper子标签.补充一张解析的总体过程流程图,画的不好,多多谅解,感谢.
- C++ 不定参数"..."的使用
#include <iostream> #include <cstdio> #include <cstdarg> #define LEN_MSG_BUFFER 12 ...
- 大场前端工程师常使用CSS3特性做跨域也是牛逼前端的开始之路
通过 CSS3 的 content 获取内容,很有意思的一个思路,实际场景中有可能用的到: CSST (CSS Text Transformation) 利用js动态创建一个link插入到文档中, 请 ...
- Java实现 第十一届蓝桥杯——走方格(渴望有题目的大佬能给小编提供一下题目,讨论群:99979568)
走方格 问题描述在平面上有一些二维的点阵. 这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第1 至第 m 列,每一个点可以用行号和列号来表示. 现在有个人站在第 ...
- P2882 Face The Right Way G 题解
题目 Farmer John has arranged his N \((1 ≤ N ≤ 5,000)\) cows in a row and many of them are facing forw ...
- c++ 数字与字符串的相互转换
首先推荐用用C++的stringstream. 主要原因是操作简单. 0x00 字符串转数字 // zcj_14.cpp : //该程序是一个注册机,原理是对输入的字符每个与2求异或的结果取低位即为注 ...
- JavaScript学习 Ⅶ
十四. DOM(文档对象模型) 节点:Node--构成HTML文档最基本的单元 文档节点:整个HTML文档 元素节点:HTMl文档中的HTML标签 属性节点:元素的属性 文本节点:HTML标签中的文本 ...
- Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数
Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数 内容大纲 1.函数的初识 2.函数的定义 3.函数的调用 4.函数的返回值 5.函数的参数 1.函数初识 # def ...
- 数据可视化实例(十六):有序条形图(matplotlib,pandas)
排序 (Ranking) 棒棒糖图 (Lollipop Chart) 棒棒糖图表以一种视觉上令人愉悦的方式提供与有序条形图类似的目的. https://datawhalechina.github.io ...
- Oracle数据泵详解
一.EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2 ...