zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    IIS网站或系统验证码不显示问题——"使用了托管的处理程序,但是未安装或未完整安装 ASP.NET"
    Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站
    RESTful API 设计指南
    Js计算当前日,当前周开始结束时间,当前月份,当前年份
    highcharts
    CSS布局 ——从display,position, float属性谈起
    CSS的选择器
    DOC窗口之cd命令(windows)
    Tomcat的启动与关闭以及启动时一闪而过的解决方法
    为什么安装jdk时,会安装两个jre?不用配置jre的环境变量
  • 原文地址:https://www.cnblogs.com/lxmhhy/p/13385475.html
Copyright © 2011-2022 走看看