diff --git a/registry/etcdv3/listener.go b/registry/etcdv3/listener.go index 6fa84126f82f134be8a8bbe3129d176a5e17d59d..61c71ee48e529b36b094d5c2532b15471515fcff 100644 --- a/registry/etcdv3/listener.go +++ b/registry/etcdv3/listener.go @@ -34,17 +34,20 @@ import ( ) type dataListener struct { - interestedURL []*common.URL + interestedURL map[string]*common.URL listener config_center.ConfigurationListener } // NewRegistryDataListener ... func NewRegistryDataListener(listener config_center.ConfigurationListener) *dataListener { - return &dataListener{listener: listener, interestedURL: []*common.URL{}} + return &dataListener{listener: listener, interestedURL: make(map[string]*common.URL, 16)} } func (l *dataListener) AddInterestedURL(url *common.URL) { - l.interestedURL = append(l.interestedURL, url) + if _, ok := l.interestedURL[url.String()]; ok { + return + } + l.interestedURL[url.String()] = url } func (l *dataListener) DataChange(eventType remoting.Event) bool { @@ -56,20 +59,18 @@ func (l *dataListener) DataChange(eventType remoting.Event) bool { return false } - for _, v := range l.interestedURL { - if serviceURL.URLEqual(*v) { - l.listener.Process( - &config_center.ConfigChangeEvent{ - Key: eventType.Path, - Value: serviceURL, - ConfigType: eventType.Action, - }, - ) - return true - } + if _, ok := l.interestedURL[serviceURL.String()]; !ok { + return false } - return false + l.listener.Process( + &config_center.ConfigChangeEvent{ + Key: eventType.Path, + Value: serviceURL, + ConfigType: eventType.Action, + }, + ) + return true } type configurationListener struct { diff --git a/registry/kubernetes/listener.go b/registry/kubernetes/listener.go index c1d4f70fed307f782e05f15a96ace6fc3f27afa9..7837233c18e364ef718b3617812cf68747785b88 100644 --- a/registry/kubernetes/listener.go +++ b/registry/kubernetes/listener.go @@ -34,17 +34,21 @@ import ( ) type dataListener struct { - interestedURL []*common.URL + interestedURL map[string]*common.URL listener config_center.ConfigurationListener } // NewRegistryDataListener ... func NewRegistryDataListener(listener config_center.ConfigurationListener) *dataListener { - return &dataListener{listener: listener} + return &dataListener{listener: listener, interestedURL: make(map[string]*common.URL, 16)} } func (l *dataListener) AddInterestedURL(url *common.URL) { - l.interestedURL = append(l.interestedURL, url) + + if _, ok := l.interestedURL[url.String()]; ok { + return + } + l.interestedURL[url.String()] = url } func (l *dataListener) DataChange(eventType remoting.Event) bool { @@ -56,20 +60,19 @@ func (l *dataListener) DataChange(eventType remoting.Event) bool { return false } - for _, v := range l.interestedURL { - if serviceURL.URLEqual(*v) { - l.listener.Process( - &config_center.ConfigChangeEvent{ - Key: eventType.Path, - Value: serviceURL, - ConfigType: eventType.Action, - }, - ) - return true - } + if _, ok := l.interestedURL[serviceURL.String()]; !ok { + return false } - return false + l.listener.Process( + &config_center.ConfigChangeEvent{ + Key: eventType.Path, + Value: serviceURL, + ConfigType: eventType.Action, + }, + ) + return true + } type configurationListener struct { diff --git a/registry/zookeeper/listener.go b/registry/zookeeper/listener.go index fe8e42db9f39190e34142149a6b67c9638a84ed2..0c46261b39471e2794e3508b65cc5b28b10e80dc 100644 --- a/registry/zookeeper/listener.go +++ b/registry/zookeeper/listener.go @@ -37,18 +37,21 @@ import ( // RegistryDataListener ... type RegistryDataListener struct { - interestedURL []*common.URL + interestedURL map[string]*common.URL listener config_center.ConfigurationListener } // NewRegistryDataListener ... func NewRegistryDataListener(listener config_center.ConfigurationListener) *RegistryDataListener { - return &RegistryDataListener{listener: listener, interestedURL: []*common.URL{}} + return &RegistryDataListener{listener: listener, interestedURL: make(map[string]*common.URL, 16)} } // AddInterestedURL ... func (l *RegistryDataListener) AddInterestedURL(url *common.URL) { - l.interestedURL = append(l.interestedURL, url) + if _, ok := l.interestedURL[url.String()]; ok { + return + } + l.interestedURL[url.String()] = url } // DataChange ... @@ -65,14 +68,19 @@ func (l *RegistryDataListener) DataChange(eventType remoting.Event) bool { logger.Errorf("Listen NewURL(r{%s}) = error{%v} eventType.Path={%v}", url, err, eventType.Path) return false } - for _, v := range l.interestedURL { - if serviceURL.URLEqual(*v) { - l.listener.Process(&config_center.ConfigChangeEvent{Value: serviceURL, ConfigType: eventType.Action}) - return true - } + + if _, ok := l.interestedURL[serviceURL.String()]; !ok { + return false } - return false + l.listener.Process( + &config_center.ConfigChangeEvent{ + Key: eventType.Path, + Value: serviceURL, + ConfigType: eventType.Action, + }, + ) + return true } // RegistryConfigurationListener ...