94 lines
2.5 KiB
Go
94 lines
2.5 KiB
Go
package config
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"sync"
|
||
"time"
|
||
)
|
||
|
||
// Config 应用配置(持久化在 MySQL monitor_kv,首次启动前由环境变量提供默认值;MySQL 连接信息首次连接仍依赖环境变量/DB_DSN)
|
||
type Config struct {
|
||
Server ServerConfig `json:"server"`
|
||
Monitor MonitorConfig `json:"monitor"`
|
||
DataPath string `json:"data_path"`
|
||
Database DatabaseConfig `json:"database"`
|
||
}
|
||
|
||
// ServerConfig 服务器配置
|
||
type ServerConfig struct {
|
||
Port string `json:"port"`
|
||
Host string `json:"host"`
|
||
}
|
||
|
||
// MonitorConfig 监控配置
|
||
type MonitorConfig struct {
|
||
Interval time.Duration `json:"interval"` // 检测间隔
|
||
Timeout time.Duration `json:"timeout"` // 请求超时时间
|
||
RetryCount int `json:"retry_count"` // 重试次数
|
||
HistoryDays int `json:"history_days"` // 保留历史天数
|
||
}
|
||
|
||
var (
|
||
cfg *Config
|
||
once sync.Once
|
||
)
|
||
|
||
// GetConfig 获取配置单例(连接 MySQL 后由 storage 根据 monitor_kv 覆盖)
|
||
func GetConfig() *Config {
|
||
once.Do(func() {
|
||
cfg = &Config{
|
||
Server: ServerConfig{
|
||
Port: getEnv("SERVER_PORT", "8080"),
|
||
Host: getEnv("SERVER_HOST", "0.0.0.0"),
|
||
},
|
||
Monitor: MonitorConfig{
|
||
Interval: parseDuration(getEnv("MONITOR_INTERVAL", "30m"), 30*time.Minute),
|
||
Timeout: parseDuration(getEnv("MONITOR_TIMEOUT", "10s"), 10*time.Second),
|
||
RetryCount: parseInt(getEnv("MONITOR_RETRY_COUNT", "3"), 3),
|
||
HistoryDays: parseInt(getEnv("MONITOR_HISTORY_DAYS", "30"), 30),
|
||
},
|
||
DataPath: getEnv("DATA_PATH", "./data"),
|
||
Database: DatabaseConfig{
|
||
Host: getEnv("DB_HOST", "192.168.1.100"),
|
||
Port: getEnv("DB_PORT", "3306"),
|
||
User: getEnv("DB_USER", "mengyaping"),
|
||
Password: getEnv("DB_PASSWORD", "mengyaping"),
|
||
Database: getEnv("DB_NAME", "mengyaping"),
|
||
},
|
||
}
|
||
})
|
||
return cfg
|
||
}
|
||
|
||
// getEnv 获取环境变量,如果不存在则返回默认值
|
||
func getEnv(key, defaultValue string) string {
|
||
if value := os.Getenv(key); value != "" {
|
||
return value
|
||
}
|
||
return defaultValue
|
||
}
|
||
|
||
// parseInt 解析整数环境变量
|
||
func parseInt(value string, defaultValue int) int {
|
||
if value == "" {
|
||
return defaultValue
|
||
}
|
||
var result int
|
||
if _, err := fmt.Sscanf(value, "%d", &result); err != nil {
|
||
return defaultValue
|
||
}
|
||
return result
|
||
}
|
||
|
||
// parseDuration 解析时间间隔环境变量
|
||
func parseDuration(value string, defaultValue time.Duration) time.Duration {
|
||
if value == "" {
|
||
return defaultValue
|
||
}
|
||
if duration, err := time.ParseDuration(value); err == nil {
|
||
return duration
|
||
}
|
||
return defaultValue
|
||
}
|