nacos.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package conf
  2. import (
  3. "fmt"
  4. "sync/atomic"
  5. "time"
  6. "git.shuncheng.lu/bigthing/gocommon/pkg/internal/nacos"
  7. "git.shuncheng.lu/bigthing/gocommon/pkg/internal/properties"
  8. "git.shuncheng.lu/bigthing/gocommon/pkg/internal/util"
  9. "github.com/nacos-group/nacos-sdk-go/vo"
  10. )
  11. var (
  12. _nacosConfig atomic.Value
  13. )
  14. func loadNacosConfig() properties.Properties {
  15. config, _ := _nacosConfig.Load().(properties.Properties)
  16. return config
  17. }
  18. func setNacosConfig(properties properties.Properties) {
  19. _nacosConfig.Store(properties)
  20. }
  21. func initNacosConfig() error {
  22. configClient, err := nacos.NewNacosConfigClient(SetAndAssertNil)
  23. if err != nil {
  24. return err
  25. }
  26. content, err := configClient.GetConfig(vo.ConfigParam{
  27. DataId: configClient.DataId,
  28. Group: configClient.Group,
  29. })
  30. if err != nil {
  31. return err
  32. }
  33. config, err := properties.ReadFromString(content)
  34. if err != nil {
  35. return err
  36. }
  37. setNacosConfig(config)
  38. err = configClient.ListenConfig(vo.ConfigParam{
  39. DataId: configClient.DataId,
  40. Group: configClient.Group,
  41. OnChange: func(namespace, group, dataId, data string) {
  42. newConfig, err := properties.ReadFromString(data)
  43. if err != nil {
  44. util.Errorf("[Nacos] configClient.ListenConfig#OnChange err, err=%v", err)
  45. return
  46. }
  47. oldConfig := loadNacosConfig()
  48. setNacosConfig(newConfig)
  49. go printChangedNacosConfig(oldConfig, newConfig)
  50. },
  51. })
  52. if err != nil {
  53. return err
  54. }
  55. return nil
  56. }
  57. // 打印配置文件变更记录
  58. func printChangedNacosConfig(oldConfig properties.Properties, newConfig properties.Properties) {
  59. defer func() {
  60. if err := recover(); err != nil {
  61. util.Errorf("[Nacos] configClient.ListenConfig#OnChange print diff find, err=%v", err)
  62. }
  63. }()
  64. printProperties := func(config map[string]string, op string, changeId string) {
  65. if config == nil || len(config) == 0 {
  66. return
  67. }
  68. changeIdLine := fmt.Sprintf("[Nacos] [change_id=%s] %s-config: ", changeId, op)
  69. for key, value := range config {
  70. util.Infof(changeIdLine + key + " = " + value)
  71. }
  72. return
  73. }
  74. printDiffPorperties := func(config map[string][]string, op string, changeId string) string {
  75. if config == nil || len(config) == 0 {
  76. return ""
  77. }
  78. result := ""
  79. changeIdLine := fmt.Sprintf("[Nacos-Config] [change_id=%s] %s-config: ", changeId, op)
  80. for key, value := range config {
  81. if value == nil || len(value) < 2 {
  82. continue
  83. }
  84. util.Infof(changeIdLine + key + " = " + value[0] + " => " + value[1])
  85. }
  86. return result
  87. }
  88. deleteMap, addMap, changeMap := oldConfig.DiffProperties(newConfig)
  89. changeId := util.ToString(time.Now().UnixNano())
  90. util.Infof("[Nacos-Config] configClient.ListenConfig#OnChange find config changed change_id=%s", changeId)
  91. printProperties(deleteMap, "delete", changeId)
  92. printProperties(addMap, "add", changeId)
  93. printDiffPorperties(changeMap, "change", changeId)
  94. }