【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设计 ...
随机推荐
- The meaningless Game
题目 Slastyona and her loyal dog Pushok are playing a meaningless game that is indeed very interesting ...
- 关于线上一次DDOS攻击和阿里云DDOS防护相关内容
问题 最近我们的一台阿里云服务器 (ECS,有公网IP,Nginx 服务器,开放了80,443),遭受到了DDOS攻击,主要攻击的行为是 攻击我们443 端口.发起大量的请求. 但是我们在 Nginx ...
- 洛谷 P1991 【无线通讯网】
这道题找到关键点那就是模板题了,代码好写哒~ 因为有S个电话,两个电话就可以连通两个块,那是不是我们就可以看做一条无消耗的边,提前连了起来.根据Kruskal的思想,我们每次加入最小的边,直到联通,由 ...
- 简单案例:form表单应用向后端发数据
效果如下图: 先新建一Django项目. 最后在terminal执行python manage.py runserver 8090 运行djago程序 浏览器输入http://127.0.0.1:80 ...
- web开发相关概念
什么是web通信? WEB采用B/S通信模式,通过超文本传送协议(HTTP, Hypertext transport protocol)进行通信.通过浏览器地址栏编写URL,向服务器发送一个请求,服务 ...
- cf1216E2 Numerical Sequence (hard version) 二分查找、思维题
题目描述 The only difference between the easy and the hard versions is the maximum value of k. You are g ...
- C/C++编程语言制作《游戏内存外挂》
通过C/C++编程语言编写一个简单的外挂,通过 API 函数修改游戏数据,从而实现作弊功能 对象分析要用的 API 函数简单介绍编写测试效果. 下面是我整理好的全套C/C++资料,加入天狼QQ7269 ...
- SQL字符串拼接FOR XML PATH
在工作中难免会遇到数据库中数据要进行拼接的问题,字符串拼接可以是用SQL的拼接也可以使用C#的拼接,本次说的是使用SQL进行拼接. 首先插入测试语句: --测试语句,准备创建表的语句:如下 CREAT ...
- MYSQL 之 JDBC(十一): JDBC获取插入记录的主键值
取得数据库自动生成的主键值 package com.litian.jdbc; import javax.swing.plaf.nimbus.State; import java.sql.*; /** ...
- Go的100天之旅-03变量
变量 变量介绍 变量这个词来源于数学,类似方程中的x.y,代表的是存储在计算机中的值.这里主要介绍Go和其它编程语言不一样的地方,在前面我们提到过,Go是一门静态语言.静态语言区别动态语言一个重要的特 ...