@@ -3,11 +3,16 @@ package main
33import (
44 "fmt"
55 "log"
6+ "net/http"
67 "os"
8+ "os/signal"
79 "path/filepath"
10+ "syscall"
811 "time"
912
1013 "github.com/spf13/pflag"
14+ "github.com/xos/serverstatus/cmd/dashboard/controller"
15+ "github.com/xos/serverstatus/cmd/dashboard/rpc"
1116 "github.com/xos/serverstatus/model"
1217 "github.com/xos/serverstatus/proto"
1318 "github.com/xos/serverstatus/service/singleton"
@@ -43,21 +48,6 @@ func init() {
4348 pflag .Parse ()
4449}
4550
46- func initSystem () {
47- // 启动 singleton 包下的所有服务
48- singleton .LoadSingleton ()
49-
50- // 每天的3:30 对 监控记录 和 流量记录 进行清理
51- if _ , err := singleton .Cron .AddFunc ("0 30 3 * * *" , singleton .CleanMonitorHistory ); err != nil {
52- panic (err )
53- }
54-
55- // 每小时对流量记录进行打点
56- if _ , err := singleton .Cron .AddFunc ("0 0 * * * *" , singleton .RecordTransferHourlyUsage ); err != nil {
57- panic (err )
58- }
59- }
60-
6151func main () {
6252 var err error
6353 hostName , err = os .Hostname ()
@@ -113,9 +103,77 @@ func main() {
113103 return
114104 }
115105
116- // 这里是原来的main函数代码
106+ // 初始化系统
117107 log .Println ("NG>> 服务启动中..." )
118- initSystem ()
108+ singleton .LoadSingleton ()
109+
110+ // 添加定时任务
111+ log .Println ("NG>> 初始化定时任务..." )
112+ // 每天的3:30 对 监控记录 和 流量记录 进行清理
113+ if _ , err := singleton .Cron .AddFunc ("0 30 3 * * *" , singleton .CleanMonitorHistory ); err != nil {
114+ panic (err )
115+ }
116+ // 每小时对流量记录进行打点
117+ if _ , err := singleton .Cron .AddFunc ("0 0 * * * *" , singleton .RecordTransferHourlyUsage ); err != nil {
118+ panic (err )
119+ }
120+
121+ // 启动HTTP和gRPC服务
122+ startServices ()
123+
124+ // 添加这段代码,等待中断信号以优雅地关闭服务
125+ log .Println ("NG>> 所有服务已启动,正在运行..." )
126+ waitForInterrupt ()
127+ }
128+
129+ // startServices 启动HTTP和gRPC服务
130+ func startServices () {
131+ // 启动RPC服务
132+ go startRPCServer ()
133+
134+ // 启动HTTP服务
135+ go startHTTPServer ()
136+
137+ // 启动其他必要的服务
138+ go dispatchReportInfoTask ()
139+ }
140+
141+ // startRPCServer 启动gRPC服务
142+ func startRPCServer () {
143+ log .Printf ("NG>> gRPC服务启动在端口 %d" , singleton .Conf .GRPCPort )
144+
145+ // 使用rpc包中的服务器
146+ rpc .ServeRPC (singleton .Conf .GRPCPort )
147+ }
148+
149+ // startHTTPServer 启动HTTP服务
150+ func startHTTPServer () {
151+ log .Printf ("NG>> HTTP服务启动在端口 %d" , singleton .Conf .HTTPPort )
152+
153+ // 使用controller包中的ServeWeb函数
154+ srv := controller .ServeWeb (singleton .Conf .HTTPPort )
155+
156+ if err := srv .ListenAndServe (); err != nil && err != http .ErrServerClosed {
157+ log .Fatalf ("NG>> HTTP服务启动失败: %v" , err )
158+ }
159+ }
160+
161+ // waitForInterrupt 等待中断信号
162+ func waitForInterrupt () {
163+ // 创建一个通道接收系统信号
164+ c := make (chan os.Signal , 1 )
165+ signal .Notify (c , os .Interrupt , syscall .SIGTERM )
166+
167+ // 阻塞等待信号
168+ <- c
169+
170+ // 收到信号后,执行清理工作
171+ log .Println ("NG>> 收到中断信号,服务正在关闭..." )
172+
173+ // 保存最后的流量统计
174+ singleton .RecordTransferHourlyUsage ()
175+
176+ log .Println ("NG>> 服务已安全关闭" )
119177}
120178
121179func dispatchReportInfoTask () {
0 commit comments