实现代理节点功能,包括主程序入口、配置加载、心跳检测和状态管理,添加相关服务和API响应结构

This commit is contained in:
ryan
2026-03-09 23:13:27 +08:00
parent 2ac083a225
commit f1624c20a3
11 changed files with 761 additions and 1 deletions
+65
View File
@@ -0,0 +1,65 @@
package agent
import (
"context"
"time"
"atsflare-agent/internal/config"
"atsflare-agent/internal/heartbeat"
"atsflare-agent/internal/protocol"
"atsflare-agent/internal/state"
syncservice "atsflare-agent/internal/sync"
)
type Runner struct {
Config *config.Config
StateStore *state.Store
HeartbeatService *heartbeat.Service
SyncService *syncservice.Service
}
func (r *Runner) Run(ctx context.Context) error {
nodeID, err := r.StateStore.EnsureNodeID()
if err != nil {
return err
}
if err = r.HeartbeatService.Register(ctx, r.nodePayload(nodeID)); err != nil {
return err
}
if err = r.SyncService.SyncOnce(ctx); err != nil {
return err
}
heartbeatTicker := time.NewTicker(r.Config.HeartbeatInterval)
defer heartbeatTicker.Stop()
syncTicker := time.NewTicker(r.Config.SyncInterval)
defer syncTicker.Stop()
for {
select {
case <-ctx.Done():
return ctx.Err()
case <-heartbeatTicker.C:
if err = r.HeartbeatService.Heartbeat(ctx, r.nodePayload(nodeID)); err != nil {
return err
}
case <-syncTicker.C:
if err = r.SyncService.SyncOnce(ctx); err != nil {
return err
}
}
}
}
func (r *Runner) nodePayload(nodeID string) protocol.NodePayload {
snapshot, _ := r.StateStore.Load()
return protocol.NodePayload{
NodeID: nodeID,
Name: r.Config.NodeName,
IP: r.Config.NodeIP,
AgentVersion: r.Config.AgentVersion,
NginxVersion: r.Config.NginxVersion,
CurrentVersion: snapshot.CurrentVersion,
LastError: snapshot.LastError,
}
}