首页 > 其他分享 >使用go写的一个api接口

使用go写的一个api接口

时间:2024-03-05 13:33:18浏览次数:24  
标签:http log err ip 接口 api go return execCmd

记录一下使用go写的一些脚本

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"os"
	"os/exec"
	"strconv"
	"strings"
	"sync"
	"time"
)

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

const (
	maxRequests   = 10
	resetDuration = time.Minute
	logFilePath   = "server.log"
)

type RequestBody struct {
	Cluster string `json:"cluster"`
	Exec    string `json:"exec"`
	Type    string `json:"type"`
	Ip      string `json:"ip"`
}

func getippath(ip string) bool {
	cmd := exec.Command("get_service_by_host", "-i", ip)

	out, err := cmd.Output()
	if err != nil {
		fmt.Println(err)
		return false
	}

	lines := strings.Split(string(out), "\n")
	for _, line := range lines {
		instance := strings.TrimSpace(line)
		if strings.Contains(instance, "k8s-eks-native-guanxing-node.K8S.all") ||
			strings.Contains(instance, "IM-GPU.SC-GPU.all") {
			return true
		}
	}
	return false
}

func FreezedHost(cluster, execCmd, freezereason, ip string) (string, error) {
	if execCmd == "freeze" {
		execCmd = "freeze"
	} else if execCmd == "unfreeze" {
		execCmd = "unfreeze"
	} else {
		return "", fmt.Errorf("error is not unfreeze or freeze")
	}

	if !getippath(ip) {
		return "", fmt.Errorf("ip is not in k8s-eks-native-guanxing-node.K8S.all or IM-GPU.SC-GPU.all")
	}

	cmd := exec.Command("matrix", "-c", cluster, "host", execCmd, "--reason", freezereason, ip)

	log.Printf("执行命令: %s", cmd.String())

	out, err := cmd.CombinedOutput()
	if err != nil {
		return "", err
	}

	return string(out), nil
}

func fetchEtcdMetricsHandler(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++

	clientIP := strings.Split(r.RemoteAddr, ":")[0]

	var requestBody RequestBody
	err := json.NewDecoder(r.Body).Decode(&requestBody)
	if err != nil {
		http.Error(w, "Invalid request body", http.StatusBadRequest)
		return
	}

	cluster := requestBody.Cluster
	execCmd := requestBody.Exec
	freezeReason := requestBody.Type
	ip := requestBody.Ip
        log.Printf("客户端IP: %s - Received params: %s, %s, %s, %s\n", clientIP, cluster, execCmd, freezeReason, ip)
	fmt.Printf("Received params: %s, %s, %s, %s\n", cluster, execCmd, freezeReason, ip)

	cmd, err := FreezedHost(cluster, execCmd, freezeReason, ip)
	fmt.Printf("Received params from client %s: %s, %s, %s, %s\n", clientIP, cluster, execCmd, freezeReason, ip)
	if err != nil {
		log.Printf("发生错误:%v", err)
		http.Error(w, fmt.Sprintf("发生错误:%v", err), http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "text/plain")
	fmt.Fprint(w, cmd)
}

func main() {
	logFile, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatalf("无法打开日志文件: %v", err)
	}
	defer logFile.Close()

	log.SetOutput(logFile)
	log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)

	http.HandleFunc("/matrix_free_api", fetchEtcdMetricsHandler)

	portStr := os.Getenv("SERVER_PORT")
	port := 6999
	if portStr != "" {
		p, err := strconv.Atoi(portStr)
		if err == nil {
			port = p
		}
	}

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

 

标签:http,log,err,ip,接口,api,go,return,execCmd
From: https://www.cnblogs.com/Direction-of-efforts/p/18053841

相关文章

  • resurfaceio graylog 的api 安全方案
    resurfaceio是graylog的api安全方案,包含的特性特性简易的api调用捕捉立即攻击以及异常的rest以及graphqlapi处理基于webhook,sql查询,以及数据导出自动化处理快速部署本地或者基于k8s的云环境架构设计resurfaceio对于流量的处理基于了goreplay扩展参考网络流量......
  • resurfaceio gor linux 二进制包
    resurfaceio的gor是对于开源版本的修改(比如开启了企业特性,同时添加了对于resurfaceiohttpoutput的支持),为了方便对于linux系统的使用我拉取了官方镜像,将二进制文件放到github了https://github.com/rongfengliang/resurfaceio-gor支的命令 Gorisasimpleht......
  • 寶可夢Pokemon Go虛擬搖桿iOS/Android免費下載
    PokemonGo仍然是迄今為止最成功的手機遊戲之一。這麼多年過去了,這款遊戲讓玩家以不同的方式參與其中。也許這款遊戲最大的吸引力在於其基於位置的設計,要求你去散步並將相機對準寶可夢。這是一種有趣的方法,但在某些情況下,它也可能是遊戲的主要限制。如果你不能出去,你就不能玩......
  • .NET Core连接MongoDB数据库
    MongoDB是一个非关系型数据库,它以文档形式存储数据,具有高性能、可扩展和灵活的特点。在.NETCore中使用MongoDB驱动程序可以很方便地连接和操作MongoDB数据库。本文将介绍如何在.NETCore项目中连接MongoDB数据库,并提供一些常用的操作示例。安装MongoDB驱动程序在.NETCore项目中......
  • 阿里巴巴/1688 api接口 获取商品详情 数据采集
    iDataRiver平台https://www.idatariver.com/zh-cn/提供开箱即用的阿里巴巴1688电商数据采集API,供用户按需调用。接口使用详情请参考阿里巴巴1688接口文档接口列表1.获取商品详情参数类型是否必填默认值示例值描述apikeystring是idr_***从控制台里复制api......
  • Django 中models定义字段类型方法及参数说明
    字段类型定义方法:方法名功能说明AutoField()定义从1开始逐次自增1的整数类型字段,如果模型里没有显示定义该属性,Django会自动将该字段增加到新表结构里。默认情况下,该字段是,主键字段BigAutoField()定义64位自增整数类型字段,功能类似于AutoField(),唯一的区......
  • 13_.NET 中 IDisposable 接口的作用和使用
    .NET中IDisposable接口的作用和使用IDisposable接口是.NET框架中定义的一个接口,用于释放非托管资源。非托管资源是指由操作系统或其他外部库管理的资源,例如文件句柄、数据库连接和网络套接字。IDisposable接口的作用是提供一种标准的方式来释放非托管资源。这有助......
  • 3-1低阶API示范
    下面的范例使用Pytorch的低阶API实现线性回归和DNN二分类低阶API主要包括张量操作,计算图和自动微分importosimportdatetime#打印时间defprintbar():nowtime=datetime.datetime.now().strftime('%Y-%m-%d%H:%M:%S')print('\n'+'========='*8+'%s'......
  • 由Django框架分析WSGI
    下面我们以django为例,分析一下wsgi的整个流程djangoWSGIapplicationWSGIapplication应该实现为一个可调用iter对象,例如函数、方法、类(包含**call**方法)。需要接收两个参数:一个字典,该字典可以包含了客户端请求的信息以及其他信息,可以认为是请求上下文,一般叫做environment(编......
  • 37vector容器与API
    vector容器与API#include<iostream>#include<vector>usingnamespacestd;/*vector容器:向量容器底层数据结构:动态开辟的数组,每次以原来空间2倍进行扩容vector<int>vec;增加:vec.push_back(20);末尾添加元素O(1)导致容器扩容vec.insert(it,20);it迭代器指向的位......