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