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