package handlers import ( "fmt" "log" "net/http" "time" "tonav-go/database" "tonav-go/models" ) // StartHealthCheck 启动异步健康检查(Goroutine) func StartHealthCheck() { go checkAllServices() ticker := time.NewTicker(5 * time.Minute) go func() { for range ticker.C { checkAllServices() } }() } func checkAllServices() { var services []models.Service database.DB.Find(&services) client := http.Client{ Timeout: 10 * time.Second, } checked := 0 for _, s := range services { // 未开启健康检查的,状态设为 unknown if !s.HealthCheckEnabled { if s.Status != "unknown" { database.DB.Model(&s).Update("status", "unknown") } continue } // 开启了健康检查的,执行检测 checkURL := s.URL if s.HealthCheckURL != "" { checkURL = s.HealthCheckURL } resp, err := client.Get(checkURL) status := "offline" if err == nil && resp.StatusCode >= 200 && resp.StatusCode < 400 { status = "online" } if resp != nil { resp.Body.Close() } database.DB.Model(&s).Update("status", status) checked++ } log.Printf("[%s] 健康检查完成,共 %d 个服务,实际检测 %d 个", time.Now().Format("2006-01-02 15:04:05"), len(services), checked) fmt.Printf("[%s] 健康检查完成\n", time.Now().Format("2006-01-02 15:04:05")) }