Go 语言 实现简单的服务监控系统示例

Go阿木 发布于 2025-06-22 7 次阅读


Go 语言实现简单的服务监控系统示例

随着现代软件系统的复杂性不断增加,服务监控变得尤为重要。它可以帮助开发者和运维人员实时了解服务的运行状态,及时发现并解决问题。Go 语言因其高效的并发处理能力和简洁的语法,成为实现服务监控系统的理想选择。本文将围绕Go语言,实现一个简单的服务监控系统示例。

系统设计

系统架构

本示例采用简单的客户端-服务器架构。客户端负责收集服务状态信息,服务器端负责接收并存储这些信息,并提供查询接口。

功能模块

1. 客户端:负责收集服务状态信息,如CPU使用率、内存使用率、网络流量等。

2. 服务器端:负责接收客户端发送的数据,存储到数据库中,并提供查询接口。

3. 数据库:用于存储服务状态信息,本文使用SQLite数据库。

实现步骤

1. 安装依赖

确保你的Go环境已经安装。然后,安装必要的依赖:

bash

go get github.com/mattn/go-sqlite3


2. 客户端实现

客户端负责收集服务状态信息,并将其发送到服务器端。以下是一个简单的客户端实现:

go

package main

import (


"fmt"


"net/http"


"time"


)

func main() {


for {


// 获取服务状态信息


status := getServiceStatus()

// 发送数据到服务器端


err := sendDataToServer(status)


if err != nil {


fmt.Println("发送数据失败:", err)


}

// 每隔5秒收集一次数据


time.Sleep(5 time.Second)


}


}

// 获取服务状态信息


func getServiceStatus() map[string]interface{} {


// 这里只是一个示例,实际应用中需要根据实际情况获取状态信息


return map[string]interface{}{


"cpu": 80,


"memory": 70,


"net": 50,


}


}

// 发送数据到服务器端


func sendDataToServer(data map[string]interface{}) error {


// 这里使用HTTP POST请求发送数据


url := "http://localhost:8080/status"


jsonData, err := json.Marshal(data)


if err != nil {


return err


}

req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))


if err != nil {


return err


}


req.Header.Set("Content-Type", "application/json")

client := &http.Client{}


resp, err := client.Do(req)


if err != nil {


return err


}


defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {


return fmt.Errorf("服务器返回错误: %d", resp.StatusCode)


}

return nil


}


3. 服务器端实现

服务器端负责接收客户端发送的数据,并将其存储到数据库中。以下是一个简单的服务器端实现:

go

package main

import (


"encoding/json"


"fmt"


"net/http"


_ "github.com/mattn/go-sqlite3"


)

func main() {


http.HandleFunc("/status", handleStatus)


http.ListenAndServe(":8080", nil)


}

// 处理客户端发送的数据


func handleStatus(w http.ResponseWriter, r http.Request) {


if r.Method != "POST" {


http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)


return


}

var data map[string]interface{}


if err := json.NewDecoder(r.Body).Decode(&data); err != nil {


http.Error(w, "Invalid data format", http.StatusBadRequest)


return


}

// 存储数据到数据库


err := storeData(data)


if err != nil {


http.Error(w, "Failed to store data", http.StatusInternalServerError)


return


}

w.WriteHeader(http.StatusOK)


}

// 存储数据到数据库


func storeData(data map[string]interface{}) error {


db, err := sql.Open("sqlite3", "./status.db")


if err != nil {


return err


}


defer db.Close()

// 创建表


_, err = db.Exec(`CREATE TABLE IF NOT EXISTS status (


id INTEGER PRIMARY KEY AUTOINCREMENT,


cpu REAL,


memory REAL,


net REAL,


created_at DATETIME DEFAULT CURRENT_TIMESTAMP


)`)


if err != nil {


return err


}

// 插入数据


stmt, err := db.Prepare(`INSERT INTO status (cpu, memory, net) VALUES (?, ?, ?)`)


if err != nil {


return err


}


defer stmt.Close()

_, err = stmt.Exec(data["cpu"], data["memory"], data["net"])


if err != nil {


return err


}

return nil


}


4. 数据库实现

使用SQLite数据库存储服务状态信息。创建一个名为`status.db`的数据库文件,并创建一个名为`status`的表:

sql

CREATE TABLE IF NOT EXISTS status (


id INTEGER PRIMARY KEY AUTOINCREMENT,


cpu REAL,


memory REAL,


net REAL,


created_at DATETIME DEFAULT CURRENT_TIMESTAMP


);


总结

本文使用Go语言实现了一个简单的服务监控系统示例。客户端负责收集服务状态信息,服务器端负责接收并存储这些信息,并提供查询接口。通过这个示例,你可以了解到Go语言在实现服务监控系统方面的优势,并可以根据实际需求进行扩展和优化。