diff --git a/backend-service/pkg/service/configManager.go b/backend-service/pkg/service/configManager.go index d53a5d7..0781e22 100644 --- a/backend-service/pkg/service/configManager.go +++ b/backend-service/pkg/service/configManager.go @@ -7,6 +7,8 @@ import ( "bash_go_service/config-loader/pkg/manager" "bash_go_service/shared/pkg/constants" "bash_go_service/shared/pkg/logger" + + "github.com/spf13/viper" ) // ConfigManagerTask 配置管理器任务 @@ -16,20 +18,26 @@ type ConfigManagerTask struct { } func NewConfigManagerTask() *ConfigManagerTask { + d := viper.GetInt64("bash_config.watch_interval") return &ConfigManagerTask{ - manager: manager.NewConfigManager(constants.ConfigFile, 5*time.Second), + manager: manager.NewConfigManager(constants.ConfigFile, time.Duration(d)*time.Second), } } func (t *ConfigManagerTask) Execute(ctx context.Context) { // 初始化配置管理器 - if err := t.manager.Initialize(); err != nil { + ff, err := t.manager.Initialize() + if err != nil { logger.Error("Failed to initialize config manager: %v", err) return } + if ff { + t.manager.StartWatching() + } else { + t.manager.StartSyncConfigTimer() + } // 启动配置监控 - t.manager.StartWatching() // 等待上下文取消 <-ctx.Done() diff --git a/config-loader/cmd/manager/main.go b/config-loader/cmd/manager/main.go index 01be957..13f8928 100644 --- a/config-loader/cmd/manager/main.go +++ b/config-loader/cmd/manager/main.go @@ -16,7 +16,7 @@ func main() { configManager := manager.NewConfigManager(constants.ConfigFile, 5*time.Second) // Initialize the manager - if err := configManager.Initialize(); err != nil { + if _, err := configManager.Initialize(); err != nil { logger.Error("Failed to initialize config manager: %v", err) os.Exit(1) } diff --git a/config-loader/pkg/manager/config_manager.go b/config-loader/pkg/manager/config_manager.go index 903e2c9..7f55468 100644 --- a/config-loader/pkg/manager/config_manager.go +++ b/config-loader/pkg/manager/config_manager.go @@ -38,7 +38,7 @@ func NewConfigManager(configFile string, watchInterval time.Duration) *ConfigMan } // Initialize 加载初始配置并开始监控配置文件的变化 -func (cm *ConfigManager) Initialize() error { +func (cm *ConfigManager) Initialize() (bool, error) { logger.Info("Initializing ConfigManager") // 尝试从共享内存中读取现有配置 @@ -52,12 +52,12 @@ func (cm *ConfigManager) Initialize() error { } else { logger.Warn("Failed to read from shared memory: %v", err) // 如果从共享内存读取失败,则从文件加载 - if err := cm.syncFromFile(); err != nil { - return fmt.Errorf("initial configuration load failed: %w", err) + if fromFile, err := cm.syncFromFile(); err != nil { + return fromFile, fmt.Errorf("initial configuration load failed: %w", err) } } - return nil + return false, nil } // StartWatching 开始监控配置文件的变化 @@ -67,6 +67,27 @@ func (cm *ConfigManager) StartWatching() { logger.Info("Started watching configuration file for changes") } +func (cm *ConfigManager) StartSyncConfigTimer() { + cm.wg.Add(1) + go func() { + ticker := time.NewTicker(cm.watchInterval) + defer ticker.Stop() + defer cm.wg.Done() + + for { + select { + case <-cm.stopChan: + logger.Info("Stopping configuration sync timer") + return + case <-ticker.C: + if err := cm.ForceSync(); err != nil { + logger.Error("Error checking/reloading config: %v", err) + } + } + } + }() +} + // Stop 优雅地停止配置管理器 func (cm *ConfigManager) Stop() { logger.Info("Stopping ConfigManager") @@ -83,8 +104,9 @@ func (cm *ConfigManager) GetCurrentConfig() *models.ConfigData { // ForceSync 强制从文件重新加载配置 func (cm *ConfigManager) ForceSync() error { - logger.Info("Force syncing configuration from file") - return cm.syncFromFile() + formFile, err := cm.syncFromFile() + logger.Info("Force syncing configuration, fromFile: %v", formFile) + return err } // ClearSharedMemory 清除共享内存中的配置 @@ -102,31 +124,35 @@ func (cm *ConfigManager) ClearSharedMemory() error { // 内部方法 // syncFromFile 从文件加载配置 -func (cm *ConfigManager) syncFromFile() error { +func (cm *ConfigManager) syncFromFile() (bool, error) { cm.mu.Lock() defer cm.mu.Unlock() loader := viper.GetString("bash_config.loader") var jsonConfig *models.JSONConfig var err error + var fromFile bool if loader == "SERVER" { + fromFile = false logger.Info("Loading configuration from server") jsonConfig, err = utils.LoadConfigFromServer() } else if loader == "FILE" { + fromFile = true logger.Info("Loading configuration from file") jsonConfig, err = utils.LoadConfigFromFile(cm.configFile) } else { + fromFile = false logger.Info("No loader specified, loading configuration from server by default") jsonConfig, err = utils.LoadConfigFromServer() } if err != nil { - return fmt.Errorf("failed to load config file: %w", err) + return fromFile, fmt.Errorf("failed to load config file: %w", err) } // 转换为共享内存格式并写入共享内存 cConfig := utils.ConvertToCConfig(jsonConfig) if err := shm.WriteConfigToSharedMemory(cConfig); err != nil { - return fmt.Errorf("failed to write to shared memory: %w", err) + return fromFile, fmt.Errorf("failed to write to shared memory: %w", err) } cm.currentConfig = cConfig @@ -134,7 +160,7 @@ func (cm *ConfigManager) syncFromFile() error { cm.lastModified = fileInfo.ModTime() // 更新最后修改时间 } - return nil + return fromFile, nil } // watchConfigFile 监控配置文件的变化 @@ -171,8 +197,9 @@ func (cm *ConfigManager) checkAndReloadConfig() error { // 如果文件修改时间更新,则重新加载配置 if fileInfo.ModTime().After(lastMod) { logger.Info("Configuration file changed, reloading") - return cm.syncFromFile() + _, err := cm.syncFromFile() + return err } - + // 如果没有变化,则返回 nil return nil }