首页 > 其他分享 >使用go写的etcd转发

使用go写的etcd转发

时间:2024-03-05 13:48:23浏览次数:26  
标签:http nil err fmt etcd 转发 go return

背景:因为公司中的机器比较老。我们的云上监控规定,使用的token的方式来监控,所以无法监控我们的etcd集群,我这里提供的一个etcd数据转发功能,能让监控到etcd集群

package main

import (
	"crypto/tls"
	"crypto/x509"
	"fmt"
	"io"
	"net/http"
	"os"
	"sync"
	"time"
)

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

const (
	maxRequests   = 10
	resetDuration = time.Minute
)

func fetchEtcdMetrics(certPath, keyPath, caPath string) (string, error) {
	etcdEndpoint := "https://127.0.0.1:2379"
	monitorEndpoint := etcdEndpoint + "/metrics"

	// 读取证书、密钥和 CA 证书
	cert, err := tls.LoadX509KeyPair(certPath, keyPath)
	if err != nil {
		return "", fmt.Errorf("加载证书和密钥失败:%v", err)
	}

	caCert, err := os.ReadFile(caPath)
	if err != nil {
		return "", fmt.Errorf("读取 CA 证书失败:%v", err)
	}

	// 创建自定义的 tls.Config
	tlsConfig := &tls.Config{
		Certificates: []tls.Certificate{cert},
		RootCAs:      x509.NewCertPool(),
	}

	// 添加 CA 证书到 RootCAs
	if ok := tlsConfig.RootCAs.AppendCertsFromPEM(caCert); !ok {
		return "", fmt.Errorf("添加 CA 证书到 RootCAs 失败")
	}

	// 创建带有 TLS 配置的 HTTP 客户端
	client := &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: tlsConfig,
		},
	}

	// 创建 HTTP GET 请求
	req, err := http.NewRequest("GET", monitorEndpoint, nil)
	if err != nil {
		return "", fmt.Errorf("创建 HTTP 请求失败:%v", err)
	}

	// 发送 HTTP 请求并获取响应
	resp, err := client.Do(req)
	if err != nil {
		return "", fmt.Errorf("获取 etcd 指标失败:%v", err)
	}
	defer resp.Body.Close()

	// 检查响应状态码
	if resp.StatusCode != http.StatusOK {
		return "", fmt.Errorf("获取 etcd 指标失败。状态码:%d", resp.StatusCode)
	}

	// 读取响应体
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("读取响应体失败:%v", err)
	}

	return string(body), 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++

	certPath := os.Args[1]
	keyPath := os.Args[2]
	caPath := os.Args[3]

	metricsData, err := fetchEtcdMetrics(certPath, keyPath, caPath)
	if err != nil {
		http.Error(w, fmt.Sprintf("发生错误:%v", err), http.StatusInternalServerError)
		return
	}

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

func main() {
	if len(os.Args) < 4 {
		fmt.Println("用法: go run your_script.go <cert_path> <key_path> <ca_path>")
		os.Exit(1)
	}

	http.HandleFunc("/fetch_etcd_metrics", fetchEtcdMetricsHandler)
	port := 5010

	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)
	}
}

 

标签:http,nil,err,fmt,etcd,转发,go,return
From: https://www.cnblogs.com/Direction-of-efforts/p/18053849

相关文章

  • 使用go写的一个api接口
    记录一下使用go写的一些脚本packagemainimport( "encoding/json" "fmt" "log" "net/http" "os" "os/exec" "strconv" "strings" "sync" "time")var( requestCo......
  • 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项目中......
  • Django 中models定义字段类型方法及参数说明
    字段类型定义方法:方法名功能说明AutoField()定义从1开始逐次自增1的整数类型字段,如果模型里没有显示定义该属性,Django会自动将该字段增加到新表结构里。默认情况下,该字段是,主键字段BigAutoField()定义64位自增整数类型字段,功能类似于AutoField(),唯一的区......
  • 由Django框架分析WSGI
    下面我们以django为例,分析一下wsgi的整个流程djangoWSGIapplicationWSGIapplication应该实现为一个可调用iter对象,例如函数、方法、类(包含**call**方法)。需要接收两个参数:一个字典,该字典可以包含了客户端请求的信息以及其他信息,可以认为是请求上下文,一般叫做environment(编......
  • Go - how the GC works
       ......
  • Go - profiling
           ......
  • RunnerGo-基于Go的开源测试平台介绍及使用
    前言测试人员目前广泛使用的测试工具如Postman、JMeter等,如Postman缺少对API的性能测试部分、JMeter则缺少测试报告和测试脚本的统一管理系统及UI测试功能,而RunnerGo的出现填补了传统测试工具的空缺,为测试人员提供了一个可以满足测试全流程的测试工具,本文将介绍RunnerGo的功能特......
  • iPoGo iOS/安卓免費下載使用安裝教學 iPoGo替代品
    身為寶可夢玩家肩負著巨大的責任,你希望每天都能取得越來越多的成就。這是寶可夢優秀玩家的基本要求,因為他們需要切換位置。因此,當物理上不可能時,他們會選擇虛擬應用程式。iPoGoPokemonGo是當今最常用的應用程式之一,它有助於傳送到突襲、跳過動畫和自動捕捉。現在讓我們進一......