优化了config_manager

This commit is contained in:
Pan Qiancheng 2025-04-23 10:27:10 +08:00
parent 6e1fe477a0
commit 5deddfef30
3 changed files with 51 additions and 16 deletions

View File

@ -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()

View File

@ -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)
}

View File

@ -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
}