这是一个基于Go语言开发的Linux系统监控项目,采用客户端-服务端架构,使用gRPC进行通信,MySQL存储监控数据,并提供Web界面展示监控信息。
- 客户端(client): 收集系统信息(CPU、内存、网络IO等)并发送到服务端
- 服务端(server): 接收客户端数据,存储到MySQL数据库,提供HTTP API和Web界面
- Web界面(html): 使用Highcharts展示监控数据的图表界面
- gRPC服务(services): 定义客户端和服务端之间的通信协议
- Go 1.23.0+
- MySQL 5.7+
- Protocol Buffers编译器 (protoc)
- Linux系统(客户端运行环境)
git clone https://github.com/stark-eagle/linux_monitor.git
cd linux_monitorgo mod tidy# Ubuntu/Debian
sudo apt-get install protobuf-compiler
# CentOS/RHEL
sudo yum install protobuf-compiler
# 或者从官网下载: https://github.com/protocolbuffers/protobuf/releasescd services
# Windows
build.bat
# Linux/Mac
for dir in */; do
cd "$dir"
for proto in *.proto; do
protoc --go_out=plugins=grpc:. "$proto"
done
cd ..
doneCREATE DATABASE monitor CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;mysql -u root -p monitor < monitor.sql编辑 server/db.go 文件中的数据库连接参数:
const (
USERNAME = "root" // 数据库用户名
PASSWORD = "123456" // 数据库密码
NETWORK = "tcp"
SERVER = "127.0.0.1" // 数据库服务器地址
PORT = 3306 // 数据库端口
DATABASE = "monitor" // 数据库名
)cd server
go run .服务端将启动两个服务:
- gRPC服务:监听端口 30001(接收客户端数据)
- HTTP服务:监听端口 808(提供Web界面和API)
编辑 client/config.toml 文件:
server = "192.168.226.133" # 服务端IP地址
port = 30001 # 服务端gRPC端口
secret = "456123" # 认证密钥cd client
go run .客户端将每5秒向服务端发送一次系统监控数据,包括:
- 系统初始化信息(CPU信息)
- 内存使用情况
- 网络IO统计
- CPU使用率
打开浏览器访问:
- 主页:
http://服务端IP:808/ - 监控页面:
http://服务端IP:808/show.html?id=客户端ID
本项目采用“客户端(采集)- 服务端(存储/接口)- 前端(展示)- gRPC 协议定义”的分层结构。核心目录与文件说明如下。
-
根目录
- go.mod / go.sum:Go 模块与依赖管理
- monitor.sql:数据库结构与存储过程定义(初始化数据库时导入)
- README.md:项目说明文档
- main.go:占位入口(当前未使用)
-
client/(客户端,采集并上报)
- main.go:客户端入口,读取配置、生成客户端ID、循环每5秒采集并通过 gRPC 上报
- config.toml:客户端配置(server、port、secret)
- confutils.go:读取与解析 config.toml
- idutils.go:生成并持久化客户端唯一ID(基于网卡信息的MD5)
- functions.go:系统信息采集封装
- getMem:内存数据
- getCPU:CPU 基础信息
- getCPUPercent:CPU 使用率
- getNetIO:网络 IO 统计
- getDiskPartition / getDiskUsage:磁盘信息(目前未对接上报)
- proto.go:gRPC 客户端调用封装(sendInit / sendMemory / sendNetIO / sendCPUPercent 等)
- proto.go 中使用的消息与服务来自 services/client 生成代码
-
server/(服务端,gRPC 接收 + HTTP API + 数据库)
- main.go:服务端入口
- 初始化数据库连接
- 启动 gRPC 服务(端口 30001)
- 启动 HTTP 服务(端口 808)
- proto.go:gRPC 服务实现(Client 服务)
- Init:客户端注册(校验 secret,写入硬件信息)
- Memory:上报内存数据
- Network:上报网络数据(当前仅打印)
- CPUPercent:上报 CPU 使用率
- db.go:数据库访问与存储过程调用
- sqlOpen / sqlQuery:数据库连接/查询
- registerClient:注册客户端(call register_client)
- addMemory:写入内存数据(call insert_memory)
- addCPUPercent:写入 CPU 使用率(call insert_cpu_percent)
- getMemory:查询内存曲线(call select_memory + 获取最大时间戳)
- getCPUPercent:查询 CPU 使用率曲线(call select_cpu_percent_with_time + 获取最大时间戳)
- getClient:查询所有客户端 ID(select id from info)
- handler.go:HTTP 路由与处理
- GET /:健康检查
- GET /api/client/get:查询所有客户端 ID
- GET /api/cpu/get?id={id}&time={last}&limit={n}:查询CPU使用率曲线
- GET /api/memory/get?id={id}&time={last}&limit={n}:查询内存曲线
- 统一设置 CORS 头,返回 JSON
- main.go:服务端入口
-
services/(gRPC 协议与生成代码)
- client/:客户端与服务端交互的 proto 定义与生成代码(client.proto / client.pb.go)
- data/、ping/、test/:其他 proto 示例/模块
- build.bat:Windows 环境下批量生成 *.pb.go 的脚本(protoc 命令)
-
html/(前端静态页面)
- index.html:主页
- show.html:图表展示页(通过 HTTP API 获取数据)
- code/、jq/、graphics/ 等:Highcharts、jQuery、样式与图形资源
-
.idea/:IDE 工程文件
-
.gitignore:Git 忽略规则
- gRPC:0.0.0.0:30001(Client -> Server 数据上报)
- HTTP:0.0.0.0:808(浏览器访问与前端 Ajax 拉取)
- Web 页面访问:
- 存储过程(在 monitor.sql 中定义并被服务端调用):
- register_client(注册客户端,使用于 server/db.go: registerClient)
- insert_memory(写入内存数据,使用于 server/db.go: addMemory)
- insert_cpu_percent(写入 CPU 使用率,使用于 server/db.go: addCPUPercent)
- select_memory(查询内存曲线,使用于 server/db.go: getMemory)
- select_cpu_percent_with_time(查询 CPU 曲线,使用于 server/db.go: getCPUPercent)
- 表:
- info(至少包含 id 字段,server/db.go 的 getClient 通过 select id from info 获取客户端列表)
- 客户端启动,读取 config.toml 并生成唯一 ID(idutils.go)
- 周期性采集系统信息(functions.go)
- 通过 gRPC 调用服务端接口(proto.go -> services/client):
- Init:注册客户端与硬件信息
- Memory:上报内存
- Network:上报网络 IO(当前服务端打印)
- CPUPercent:上报 CPU 使用率
- 服务端写库并提供 HTTP 接口给前端页面查询展示