Go 在运维开发中的应用

一、介绍

Go语言(也称Golang)因其高效、简洁和强大的并发支持而在云计算和运维开发中变得非常受欢迎。

  • 性能优越:Go编译成机器代码,运行效率高,且内存占用少,适合高性能运维工具的开发。

  • 并发支持:Go内置goroutines和channels,简化了并发编程,适合开发需要高并发处理的运维工具。

  • 易于部署:Go语言编译生成静态二进制文件,无需依赖其他库,方便部署。

  • 丰富的标准库:Go标准库提供了丰富的功能,可以快速开发运维工具。

二、Go语言在运维开发中的实际应用

示例一:简单的端口监控工具

运维中,监控服务端口是否可用是一个常见需求。我们可以使用Go编写一个简单的端口监控工具。

Go 复制代码
package main

import (
	"fmt"
	"net"
	"time"
)

// CheckPort 检查指定主机和端口是否可达
func CheckPort(host string, port int) bool {
	address := fmt.Sprintf("%s:%d", host, port)
	conn, err := net.DialTimeout("tcp", address, 2*time.Second)
	if err != nil {
		return false
	}
	_ = conn.Close()
	return true
}

func main() {
	// 定义一个结构体来存储服务的地址和端口
	type Service struct {
		Address string
		Port    int
	}
	pingStr := []Service{
		{"127.0.0.1", 6379}, //redis:6379
		{"127.0.0.1", 3306}, //mysql:3306
		{"192.168.4.17", 1430},
	}
	for {
		for _, service := range pingStr {
			if CheckPort(service.Address, service.Port) {
				fmt.Printf("%v:%v 主机可以访问\n", service.Address, service.Port)
			} else {
				fmt.Printf("%v:%v 主机不可以访问\n", service.Address, service.Port)
			}
		}
		time.Sleep(5 * time.Second)
	}
}

示例二:系统资源监控工具

运维工作中,监控系统资源(如CPU、内存、磁盘)是非常重要的任务。Go语言的syscall包和第三方库gopsutil非常适合这类任务。

安装

Go 复制代码
go mod init sysmonitor
go get github.com/shirou/gopsutil
Go 复制代码
package main

import (
	"fmt"
	"github.com/shirou/gopsutil/cpu"
	"github.com/shirou/gopsutil/disk"
	"github.com/shirou/gopsutil/mem"
	"time"
)

// PrintCPUUsage 打印CPU使用情况
func PrintCPUUsage() {
	percent, _ := cpu.Percent(0, false)
	fmt.Printf("CPU使用情况: %.2f%%\n", percent[0])
}

// PrintMemoryUsage 打印内存使用情况
func PrintMemoryUsage() {
	vm, _ := mem.VirtualMemory()
	fmt.Printf("Memory内存使用情况: %.2f%%\n", vm.UsedPercent)
}

// PrintDiskUsage 打印磁盘使用情况
func PrintDiskUsage() {
	u, _ := disk.Usage("/")
	fmt.Printf("Disk磁盘使用情况: %.2f%%\n", u.UsedPercent)
}

func main() {
	fmt.Println("开始监控")
	for {
		PrintCPUUsage()
		PrintMemoryUsage()
		PrintDiskUsage()
		fmt.Println("---------------------")
		time.Sleep(2 * time.Second)
	}
}

可能受杀毒软件、防火墙、权限等限制

示例三:自动化运维脚本

自动化运维任务是DevOps领域的重要组成部分。例如,我们可以使用Go语言编写脚本来自动化部署应用。

假设我们有一个简单的应用需要在多个服务器上部署,以下是一个基本的自动化部署脚本:

Go 复制代码
package main

import (
	"fmt"
	"os/exec"
)

// ExecuteSSHCommand 在指定服务器上执行命令
func ExecuteSSHCommand(host, user, command string) error {
	cmd := exec.Command("ssh", fmt.Sprintf("%s@%s", user, host), command)
	output, err := cmd.CombinedOutput()
	if err != nil {
		return fmt.Errorf("执行命令时出错: %s\n%s", err, string(output))
	}

	fmt.Printf("输出来自%s:\n%s\n", host, string(output))
	return nil
}

func main() {
	servers := []string{"server1.example.com", "server2.example.com"}
	user := "admin"
	command := "sudo systemctl restart myapp"

	for _, server := range servers {
		err := ExecuteSSHCommand(server, user, command)
		if err != nil {
			fmt.Printf("未能在上执行命令%s: %s\n", server, err)
		} else {
			fmt.Printf("已成功在上执行命令%s\n", server)
		}
	}
}

参考:https://mp.weixin.qq.com/s/g31nwEpyhA0BZJWXw05jig

相关推荐
童先生11 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu13 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚36 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会39 分钟前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香41 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ULTRA??1 小时前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
远望清一色1 小时前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
杜杜的man1 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang