diff --git a/registry/servicediscovery/service_discovery_registry.go b/registry/servicediscovery/service_discovery_registry.go index 6d07dd318e..45562c55bc 100644 --- a/registry/servicediscovery/service_discovery_registry.go +++ b/registry/servicediscovery/service_discovery_registry.go @@ -19,6 +19,7 @@ package servicediscovery import ( "errors" + "sort" "strconv" "strings" "sync" @@ -194,8 +195,7 @@ func (s *serviceDiscoveryRegistry) UnSubscribe(url *common.URL, listener registr if services == nil { return nil } - // FIXME ServiceNames.String() is not good - serviceNamesKey := services.String() + serviceNamesKey := sortServices(services) l := s.serviceListeners[serviceNamesKey] if l != nil { l.RemoveListener(url.ServiceKey()) @@ -350,9 +350,8 @@ func (s *serviceDiscoveryRegistry) Subscribe(url *common.URL, notify registry.No } func (s *serviceDiscoveryRegistry) SubscribeURL(url *common.URL, notify registry.NotifyListener, services *gxset.HashSet) { - // FIXME ServiceNames.String() is not good var err error - serviceNamesKey := services.String() + serviceNamesKey := sortServices(services) protocol := constant.TriProtocol // consume "tri" protocol by default, other protocols need to be specified on reference/consumer explicitly if url.Protocol != "" { protocol = url.Protocol @@ -392,6 +391,17 @@ func (s *serviceDiscoveryRegistry) SubscribeURL(url *common.URL, notify registry }() } +func sortServices(services *gxset.HashSet) string { + list := make([]string, 0, services.Size()) + for _, v := range services.Values() { + if s, ok := v.(string); ok && s != "" { + list = append(list, s) + } + } + sort.Strings(list) + return strings.Join(list, ",") +} + // LoadSubscribeInstances load subscribe instance func (s *serviceDiscoveryRegistry) LoadSubscribeInstances(url *common.URL, notify registry.NotifyListener) error { return nil