package conf import ( "fmt" "sync/atomic" "time" "git.shuncheng.lu/bigthing/gocommon/pkg/internal/nacos" "git.shuncheng.lu/bigthing/gocommon/pkg/internal/properties" "git.shuncheng.lu/bigthing/gocommon/pkg/internal/util" "github.com/nacos-group/nacos-sdk-go/vo" ) var ( _nacosConfig atomic.Value ) func loadNacosConfig() properties.Properties { config, _ := _nacosConfig.Load().(properties.Properties) return config } func setNacosConfig(properties properties.Properties) { _nacosConfig.Store(properties) } func initNacosConfig() error { configClient, err := nacos.NewNacosConfigClient(SetAndAssertNil) if err != nil { return err } content, err := configClient.GetConfig(vo.ConfigParam{ DataId: configClient.DataId, Group: configClient.Group, }) if err != nil { return err } config, err := properties.ReadFromString(content) if err != nil { return err } setNacosConfig(config) err = configClient.ListenConfig(vo.ConfigParam{ DataId: configClient.DataId, Group: configClient.Group, OnChange: func(namespace, group, dataId, data string) { newConfig, err := properties.ReadFromString(data) if err != nil { util.Errorf("[Nacos] configClient.ListenConfig#OnChange err, err=%v", err) return } oldConfig := loadNacosConfig() setNacosConfig(newConfig) go printChangedNacosConfig(oldConfig, newConfig) }, }) if err != nil { return err } return nil } // 打印配置文件变更记录 func printChangedNacosConfig(oldConfig properties.Properties, newConfig properties.Properties) { defer func() { if err := recover(); err != nil { util.Errorf("[Nacos] configClient.ListenConfig#OnChange print diff find, err=%v", err) } }() printProperties := func(config map[string]string, op string, changeId string) { if config == nil || len(config) == 0 { return } changeIdLine := fmt.Sprintf("[Nacos] [change_id=%s] %s-config: ", changeId, op) for key, value := range config { util.Infof(changeIdLine + key + " = " + value) } return } printDiffPorperties := func(config map[string][]string, op string, changeId string) string { if config == nil || len(config) == 0 { return "" } result := "" changeIdLine := fmt.Sprintf("[Nacos-Config] [change_id=%s] %s-config: ", changeId, op) for key, value := range config { if value == nil || len(value) < 2 { continue } util.Infof(changeIdLine + key + " = " + value[0] + " => " + value[1]) } return result } deleteMap, addMap, changeMap := oldConfig.DiffProperties(newConfig) changeId := util.ToString(time.Now().UnixNano()) util.Infof("[Nacos-Config] configClient.ListenConfig#OnChange find config changed change_id=%s", changeId) printProperties(deleteMap, "delete", changeId) printProperties(addMap, "add", changeId) printDiffPorperties(changeMap, "change", changeId) }