优化了config_manager
This commit is contained in:
parent
6e1fe477a0
commit
5deddfef30
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue