首页 > 其他分享 >使用go写了一个简单的http接口

使用go写了一个简单的http接口

时间:2024-03-08 15:57:56浏览次数:20  
标签:http err exec opera ip fmt 接口 go

使用go写了一个简单的http接口

package main

import (
	"fmt"
	"net/http"
	"os/exec"
	"sync"
	"time"
)

var (
	requestCount  int
	lastTimestamp time.Time
	mu            sync.Mutex
)

const (
	maxRequests   = 30
	resetDuration = time.Minute
)

// 假设 metricsData 是一个全局变量
var metricsData string

func ExecMatrixcmd(opera, ip string) string {
	exec_matrixcmd := "/home/work/matrix/matrix-cli/matrix"
	var execcmd string


	if opera == "add" {
		execcmd = "props_add"
		cmd := exec.Command(exec_matrixcmd, "host", execcmd, ip, `{"EKS_CLUSTER_SYMBOL": "k8s-1"}`)
		fmt.Println(cmd)
		output, err := cmd.CombinedOutput()

		if err != nil {
			return fmt.Sprintf("发生错误:%v", err)
		}
		return string(output)
	} else if opera == "remove" {
		execcmd = "props_remove"
		cmd := exec.Command(exec_matrixcmd, "host", execcmd, ip, "EKS_CLUSTER_SYMBOL")
		fmt.Println(cmd)
		output, err := cmd.CombinedOutput()

		if err != nil {
			return fmt.Sprintf("发生错误:%v", err)
		}
		return string(output)
	} else {
		return "Invalid operation"
	}

	// cmd := exec.Command(exec_matrixcmd, "host", execcmd, ip, `{"EKS_CLUSTER_SYMBOL": "k8s-1"}`)




}

func matrixcmdHandler(w http.ResponseWriter, r *http.Request) {
	mu.Lock()
	defer mu.Unlock()

	now := time.Now()
	if now.Sub(lastTimestamp) > resetDuration {
		requestCount = 0
		lastTimestamp = now
	}

	if requestCount >= maxRequests {
		http.Error(w, "请求频率过高", http.StatusTooManyRequests)
		return
	}

	requestCount++

	// 获取名为 "opera" 的 URL 参数
	opera := r.URL.Query().Get("opera")
	// 获取名为 "ip" 的 URL 参数
	ip := r.URL.Query().Get("ip")
	if opera == "add" {
		// 执行相关操作
		result := ExecMatrixcmd("add", ip)
		w.Header().Set("Content-Type", "text/plain")
		fmt.Fprint(w, result)
	} else if opera == "remove" {
		// 执行相关操作
		result := ExecMatrixcmd("remove", ip)
		w.Header().Set("Content-Type", "text/plain")
		fmt.Fprint(w, result)
	} else {
		http.Error(w, "无效的操作类型", http.StatusBadRequest)
	}

}

func main() {
	http.HandleFunc("/api/v1/matrix/", matrixcmdHandler)
	port := 5119

	fmt.Printf("服务器正在运行,地址:http://0.0.0.0:%d\n", port)
	err := http.ListenAndServe(fmt.Sprintf(":%d", port), nil)
	if err != nil {
		fmt.Printf("启动服务器时发生错误:%v\n", err)
	}
}

接口访问:

curl "http://xxxxxxxxxxxx:5119/api/v1/matrix/?opera=${add|remove}&ip=xx.xx.xx.xx"

 

标签:http,err,exec,opera,ip,fmt,接口,go
From: https://www.cnblogs.com/Direction-of-efforts/p/18061150

相关文章

  • docker 部署 django + mysql + vue 项目
    ​项目目录结构,在Vue和Django项目根目录下创建Dockerfile文件,在父级目录下创建docker-compose.yml文件Project#父级目录├─client#vue3项目目录│├─public│└─src│├─*files│├─*files│├─Dockerfile└─server#Django项......
  • .net api接口接收字符串或者xml
    a///<summary>///接收字符串或者xml///</summary>///<returns></returns>[HttpPost]publicasyncTask<JsonResult>AcceptXMLOrString(){varlen=Convert.ToInt32(HttpContext.Request.ContentLength);byte[]byt=newbyte......
  • mongodb6.0.13 搭建复制集PSA
    一、材料mongodb:6.0.13mongosh:2.1.5  openssl-1.1.1w系统:redhat4.8二、模式PDA:一个主节点(Primary)、  一个延迟副节点(SEcondary)、一个仲裁节点(arbiter)PDA主节点延迟副节点仲裁节点名称PrimarySecondaryArbiter端口27017......
  • API电商接口大数据分析与数据挖掘 (商品详情店铺)
    API接口、数据分析以及数据挖掘在商品详情和店铺相关的应用中,各自扮演着重要的角色。以下是关于它们各自的功能以及如何在商品详情和店铺分析中协同工作的简要说明。API接口API(应用程序接口)是一种允许不同软件应用程序相互通信的方式。在商品详情和店铺分析的上下文中,API接口可......
  • python-Django基础学习笔记
    (由于笔记来自本地的Typora,图片未能上传,文章内容并不完整)路由器配置初始Django-创建/结构/配置settingsURL定义/视图函数路由配置path、re_pathpython-mvenv"名字"#下载Django环境pipinstalldjango==2.2.2-ihttps://pypi.douban.com/simple#激活虚拟环境D:......
  • docker安装MongoDB
    需注意,docker版本不能太低,否则执行会报:missingsignaturekey(缺少签名密钥):需要重新安装docker,所以docker最开始最好安装新版本:yuminstalldocker-ce-y参考的链接:https://www.4vsy.com/article/231.html,https://blog.csdn.net/qq_25430563/article/details/127977667doc......
  • c# RestClient 请求接口
    引用RestSharp.dll//人员信息RestClientclient=newRestClient("url");client.Timeout=-1;varrequest=newRestRequest(Method.POST);request.AddHeader("appId",appId);......
  • 自动化之接口测试基础
    1.接口是啥?==>传递数据的通道接口测试:是测试系统组件间接口的一种测试接口测试主要包括:1.同一个系统中模块与模块间的接口(内部接口)2.跨系统平台与平台间的对接(外部接口)接口类型:1.HTTP接口:通过get或post等来获取数据,在数据处理上效率比较高  2.Webservice接口:通过soap协议来......
  • Go和TinyGo
    Go和TinyGo是两种不同的Go语言编译器,它们之间有以下几点区别:目标平台:Go:Go语言编译器主要面向通用计算机平台,如Windows、Linux、macOS等。TinyGo:TinyGo专注于支持嵌入式系统和物联网设备等资源受限的平台,如微控制器、嵌入式设备、WebAssembly等。性能:Go:Go编译器生成的......
  • Golang使用SSE(EventSource)
    gopackagemainimport( "fmt" "gopkg.in/antage/eventsource.v1" "log" "net/http" "time")funcmain(){ es:=eventsource.New(nil,nil) deferes.Close() http.Handle("/",http.FileServe......