nacos_dynamic_event.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package conf
  2. // import "leafstalk/log"
  3. // // EventFunc 动态配置事件回调函数类型定义
  4. // type EventFunc func(key string, val interface{})
  5. // // event 动态事件结构体
  6. // type event struct {
  7. // sync.Mutex
  8. // config map[string]interface{} // 本地缓存配置。用于初始化和对比新配置中的差异项,当存在差异项时进行回调处理使用
  9. // list map[string][]EventFunc // 所有事件的列表
  10. // }
  11. // var dynamicEvent *event // 动态事件实例
  12. // // // 初始化动态配置事件
  13. // // err = initDynamicEvent(cfgCenter, nacosCfg.PublicGroup)
  14. // // if err != nil {
  15. // // log.Warnf("LoadSysConfig initDynamicEvent error %v", err)
  16. // // return
  17. // // }
  18. // // initDynamicEvent 初始化动态配置事件
  19. // func initDynamicEvent(cfgCenter *ConfigCenterAgent, group string) (err error) {
  20. // dynamicEvent = &event{
  21. // list: make(map[string][]EventFunc),
  22. // }
  23. // // 初始化时先获取一次动态配置,将其保存到本地
  24. // content, err := cfgCenter.GetConfig("dynamicConfig", group)
  25. // if err != nil {
  26. // return
  27. // }
  28. // if err = json.Unmarshal([]byte(content), &dynamicEvent.config); err != nil {
  29. // log.Warnf("initDynamicEvent error %v", content)
  30. // return
  31. // }
  32. // if dynamicEvent.config == nil {
  33. // err = errors.New("exception in obtaining dynamic config, config is nil")
  34. // return
  35. // }
  36. // // 开始监听动态配置变化
  37. // return cfgCenter.ListenChanges("dynamicConfig", group, func(namespace, group, dataId, newContent string) {
  38. // var newConfig map[string]interface{}
  39. // if err = json.Unmarshal([]byte(newContent), &newConfig); err != nil {
  40. // // 解析配置出错,打印错误日志并返回
  41. // log.Errorf("error parsing dynamic config for listen, err:%+v, newContent:%v", err, newContent)
  42. // return
  43. // }
  44. // log.Infof("initDynamicEvent content %v", newContent)
  45. // keys := CompareMaps(dynamicEvent.config, newConfig)
  46. // if len(keys) == 0 {
  47. // return
  48. // }
  49. // dynamicEvent.Lock()
  50. // defer dynamicEvent.Unlock()
  51. // dynamicEvent.config = newConfig
  52. // for _, key := range keys {
  53. // dynamicEvent.CallBack(key)
  54. // }
  55. // })
  56. // }
  57. // // CallBack 触发一个分组的事件回调
  58. // func (e *event) CallBack(key string) {
  59. // val := e.config[key]
  60. // if cbfs, ok := e.list[key]; ok {
  61. // for _, f := range cbfs {
  62. // val2, err := deepcopy.Copy(val)
  63. // if err != nil {
  64. // log.Errorf("CallBack deepcopy error %v", err)
  65. // }
  66. // f(key, val2)
  67. // }
  68. // }
  69. // }
  70. // // CompareMaps 检查old 和 new 中每个 key 的值是否相等,返回不相等的key列表
  71. // func CompareMaps(old, new map[string]interface{}) (diffKeys []string) {
  72. // if new == nil {
  73. // return
  74. // }
  75. // for key := range old {
  76. // value2, ok := new[key]
  77. // if ok && !reflect.DeepEqual(old[key], value2) {
  78. // diffKeys = append(diffKeys, key)
  79. // }
  80. // }
  81. // for key := range new {
  82. // if _, ok := old[key]; !ok {
  83. // diffKeys = append(diffKeys, key)
  84. // }
  85. // }
  86. // return diffKeys
  87. // }
  88. // // RegisterAndCall 往一个分组中注册事件并触发一次事件回调
  89. // // 这里的 keyGroup 表示一个配置键,同一个键可以有多个回调方法注册。
  90. // // 当键发生变化时,会触发该键下所有注册的回调事件。
  91. // func RegisterAndCall(key string, callback EventFunc) {
  92. // dynamicEvent.Lock()
  93. // defer dynamicEvent.Unlock()
  94. // val := dynamicEvent.config[key]
  95. // val2, err := deepcopy.Copy(val)
  96. // if err != nil {
  97. // log.Fatalf("RegisterAndCall deepcopy error %v", err)
  98. // }
  99. // dynamicEvent.list[key] = append(dynamicEvent.list[key], callback)
  100. // callback(key, val2)
  101. // }
  102. // configCenterAgent *ConfigCenterAgent
  103. // nacosCfg *LocalNacosConfig