This is an automated email from the ASF dual-hosted git repository.

alexstocks pushed a commit to branch config-enhance
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git


The following commit(s) were added to refs/heads/config-enhance by this push:
     new ecd6529  Fix the name mapping incompatibility (#1465)
ecd6529 is described below

commit ecd652963ea8163b43a923acba4ef71c7b2d185b
Author: alchemy-lee <[email protected]>
AuthorDate: Fri Sep 24 13:19:45 2021 +0800

    Fix the name mapping incompatibility (#1465)
    
    * fix metadata bug
    
    * fix metadata bug
    
    * fix metadata bug
    
    * fix name mapping bug for zk
    
    * modify comment
    
    * fix path incompatible
    
    * fix ci failure
    
    * fix ci failure
    
    * fix ci failure
    
    * fix name mapping bug for nacos
    
    * feat: etcd fit service name mapping uncoupling
    
    * fix name mapping bug for etcd
    
    * fix ci failure
    
    Co-authored-by: MasterKenway <[email protected]>
---
 common/constant/key.go                             |  1 +
 common/metadata_info.go                            |  2 +-
 config/instance/metadata_report_test.go            | 13 ++++-
 imports/imports.go                                 |  2 +-
 .../mapping/dynamic/service_name_mapping_test.go   | 62 ----------------------
 metadata/mapping/memory/service_name_mapping.go    |  5 +-
 .../{dynamic => metadata}/service_name_mapping.go  | 42 +++++++--------
 metadata/mapping/mock_service_name_mapping.go      |  8 ++-
 metadata/mapping/service_name_mapping.go           |  8 ++-
 metadata/report/etcd/report.go                     | 33 ++++++++++++
 metadata/report/etcd/report_test.go                | 30 +++++++++++
 metadata/report/nacos/report.go                    | 45 ++++++++++++++++
 metadata/report/report.go                          | 10 ++++
 metadata/report/zookeeper/report.go                | 35 +++++++++++-
 metadata/service/exporter/configurable/exporter.go |  2 +-
 metadata/service/remote/service_test.go            | 13 ++++-
 ... => event_publishing_service_discovery_test.go} |  0
 registry/event/service_name_mapping_listener.go    | 10 ++--
 .../servicediscovery/service_discovery_registry.go | 14 ++---
 19 files changed, 217 insertions(+), 118 deletions(-)

diff --git a/common/constant/key.go b/common/constant/key.go
index 5a5f9d6..80d2fe7 100644
--- a/common/constant/key.go
+++ b/common/constant/key.go
@@ -49,6 +49,7 @@ const (
        PORT_KEY                 = "port"
        PROTOCOL_KEY             = "protocol"
        PATH_SEPARATOR           = "/"
+       COMMA_SEPARATOR          = ","
        // DUBBO_KEY                = "dubbo"
        SSL_ENABLED_KEY = "ssl-enabled"
        // PARAMS_TYPE_Key key used in pass through invoker factory, to define 
param type
diff --git a/common/metadata_info.go b/common/metadata_info.go
index e64e72a..9c43f69 100644
--- a/common/metadata_info.go
+++ b/common/metadata_info.go
@@ -187,7 +187,7 @@ func NewServiceInfo(name, group, version, protocol, path 
string, params map[stri
                Group:      group,
                Version:    version,
                Protocol:   protocol,
-               Path:       path,
+               Path:       strings.TrimPrefix(path, "/"),
                Params:     params,
                ServiceKey: serviceKey,
                MatchKey:   matchKey,
diff --git a/config/instance/metadata_report_test.go 
b/config/instance/metadata_report_test.go
index d665f61..e57f75c 100644
--- a/config/instance/metadata_report_test.go
+++ b/config/instance/metadata_report_test.go
@@ -22,6 +22,7 @@ import (
 )
 
 import (
+       gxset "github.com/dubbogo/gost/container/set"
        "github.com/stretchr/testify/assert"
 )
 
@@ -50,11 +51,19 @@ func (m *mockMetadataReportFactory) 
CreateMetadataReport(*common.URL) report.Met
 
 type mockMetadataReport struct{}
 
-func (m mockMetadataReport) GetAppMetadata(metadataIdentifier 
*identifier.SubscriberMetadataIdentifier) (*common.MetadataInfo, error) {
+func (m mockMetadataReport) RegisterServiceAppMapping(string, string, string) 
error {
        panic("implement me")
 }
 
-func (m mockMetadataReport) PublishAppMetadata(metadataIdentifier 
*identifier.SubscriberMetadataIdentifier, info *common.MetadataInfo) error {
+func (m mockMetadataReport) GetServiceAppMapping(string, string) 
(*gxset.HashSet, error) {
+       panic("implement me")
+}
+
+func (m mockMetadataReport) 
GetAppMetadata(*identifier.SubscriberMetadataIdentifier) (*common.MetadataInfo, 
error) {
+       panic("implement me")
+}
+
+func (m mockMetadataReport) 
PublishAppMetadata(*identifier.SubscriberMetadataIdentifier, 
*common.MetadataInfo) error {
        panic("implement me")
 }
 
diff --git a/imports/imports.go b/imports/imports.go
index cd346e4..60f238e 100644
--- a/imports/imports.go
+++ b/imports/imports.go
@@ -25,7 +25,7 @@ import (
        _ "dubbo.apache.org/dubbo-go/v3/config_center/nacos"
        _ "dubbo.apache.org/dubbo-go/v3/config_center/zookeeper"
        _ "dubbo.apache.org/dubbo-go/v3/filter/filter_impl"
-       _ "dubbo.apache.org/dubbo-go/v3/metadata/mapping/dynamic"
+       _ "dubbo.apache.org/dubbo-go/v3/metadata/mapping/metadata"
        _ "dubbo.apache.org/dubbo-go/v3/metadata/report/etcd"
        _ "dubbo.apache.org/dubbo-go/v3/metadata/report/nacos"
        _ "dubbo.apache.org/dubbo-go/v3/metadata/report/zookeeper"
diff --git a/metadata/mapping/dynamic/service_name_mapping_test.go 
b/metadata/mapping/dynamic/service_name_mapping_test.go
deleted file mode 100644
index 5124b30..0000000
--- a/metadata/mapping/dynamic/service_name_mapping_test.go
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dynamic
-
-import (
-       "testing"
-)
-
-import (
-       gxset "github.com/dubbogo/gost/container/set"
-
-       "github.com/stretchr/testify/assert"
-)
-
-import (
-       "dubbo.apache.org/dubbo-go/v3/common/constant"
-       "dubbo.apache.org/dubbo-go/v3/config"
-       "dubbo.apache.org/dubbo-go/v3/config_center"
-)
-
-func TestDynamicConfigurationServiceNameMapping(t *testing.T) {
-       // mock data
-       appName := "myApp"
-       dc, err := (&config_center.MockDynamicConfigurationFactory{
-               Content: appName,
-       }).GetDynamicConfiguration(nil)
-       assert.NoError(t, err)
-       config.GetApplicationConfig().Name = appName
-
-       mapping := &DynamicConfigurationServiceNameMapping{dc: dc}
-       intf := constant.METADATA_SERVICE_NAME
-       group := "myGroup"
-       version := "myVersion"
-       protocol := "myProtocol"
-
-       err = mapping.Map(intf, group, version, protocol)
-       assert.Nil(t, err)
-       intf = "MyService"
-       err = mapping.Map(intf, group, version, protocol)
-       assert.Nil(t, err)
-
-       var result *gxset.HashSet
-       result, err = mapping.Get(intf, group, version, protocol)
-       assert.Nil(t, err)
-       assert.Equal(t, 1, result.Size())
-       assert.True(t, result.Contains(appName))
-}
diff --git a/metadata/mapping/memory/service_name_mapping.go 
b/metadata/mapping/memory/service_name_mapping.go
index cc10439..73b0603 100644
--- a/metadata/mapping/memory/service_name_mapping.go
+++ b/metadata/mapping/memory/service_name_mapping.go
@@ -26,6 +26,7 @@ import (
 )
 
 import (
+       "dubbo.apache.org/dubbo-go/v3/common"
        "dubbo.apache.org/dubbo-go/v3/common/extension"
        "dubbo.apache.org/dubbo-go/v3/config"
        "dubbo.apache.org/dubbo-go/v3/metadata/mapping"
@@ -37,11 +38,11 @@ func init() {
 
 type InMemoryServiceNameMapping struct{}
 
-func (i *InMemoryServiceNameMapping) Map(serviceInterface string, group 
string, version string, protocol string) error {
+func (i *InMemoryServiceNameMapping) Map(url *common.URL) error {
        return nil
 }
 
-func (i *InMemoryServiceNameMapping) Get(serviceInterface string, group 
string, version string, protocol string) (*gxset.HashSet, error) {
+func (i *InMemoryServiceNameMapping) Get(url *common.URL) (*gxset.HashSet, 
error) {
        return gxset.NewSet(config.GetApplicationConfig().Name), nil
 }
 
diff --git a/metadata/mapping/dynamic/service_name_mapping.go 
b/metadata/mapping/metadata/service_name_mapping.go
similarity index 63%
rename from metadata/mapping/dynamic/service_name_mapping.go
rename to metadata/mapping/metadata/service_name_mapping.go
index 7839e07..572dda8 100644
--- a/metadata/mapping/dynamic/service_name_mapping.go
+++ b/metadata/mapping/metadata/service_name_mapping.go
@@ -15,27 +15,24 @@
  * limitations under the License.
  */
 
-package dynamic
+package metadata
 
 import (
-       "strconv"
        "sync"
-       "time"
 )
 
 import (
-       "github.com/dubbogo/gost/container/set"
-
+       gxset "github.com/dubbogo/gost/container/set"
        perrors "github.com/pkg/errors"
 )
 
 import (
-       commonCfg "dubbo.apache.org/dubbo-go/v3/common/config"
+       "dubbo.apache.org/dubbo-go/v3/common"
        "dubbo.apache.org/dubbo-go/v3/common/constant"
        "dubbo.apache.org/dubbo-go/v3/common/extension"
        "dubbo.apache.org/dubbo-go/v3/common/logger"
        "dubbo.apache.org/dubbo-go/v3/config"
-       "dubbo.apache.org/dubbo-go/v3/config_center"
+       "dubbo.apache.org/dubbo-go/v3/config/instance"
        "dubbo.apache.org/dubbo-go/v3/metadata/mapping"
 )
 
@@ -48,14 +45,14 @@ func init() {
        extension.SetGlobalServiceNameMapping(GetNameMappingInstance)
 }
 
-// DynamicConfigurationServiceNameMapping is the implementation based on 
config center
+// MetadataServiceNameMapping is the implementation based on metadata report
 // it's a singleton
-type DynamicConfigurationServiceNameMapping struct {
-       dc config_center.DynamicConfiguration
+type MetadataServiceNameMapping struct {
 }
 
 // Map will map the service to this application-level service
-func (d *DynamicConfigurationServiceNameMapping) Map(serviceInterface string, 
group string, version string, protocol string) error {
+func (d *MetadataServiceNameMapping) Map(url *common.URL) error {
+       serviceInterface := url.GetParam(constant.INTERFACE_KEY, "")
        // metadata service is admin service, should not be mapped
        if constant.METADATA_SERVICE_NAME == serviceInterface {
                logger.Info("try to map the metadata service, will be ignored")
@@ -63,11 +60,8 @@ func (d *DynamicConfigurationServiceNameMapping) 
Map(serviceInterface string, gr
        }
 
        appName := config.GetApplicationConfig().Name
-       value := time.Now().UnixNano()
-
-       err := d.dc.PublishConfig(appName,
-               d.buildGroup(serviceInterface),
-               strconv.FormatInt(value, 10))
+       metadataReport := instance.GetMetadataReportInstance()
+       err := metadataReport.RegisterServiceAppMapping(serviceInterface, 
defaultGroup, appName)
        if err != nil {
                return perrors.WithStack(err)
        }
@@ -75,28 +69,28 @@ func (d *DynamicConfigurationServiceNameMapping) 
Map(serviceInterface string, gr
 }
 
 // Get will return the application-level services. If not found, the empty set 
will be returned.
-// if the dynamic configuration got error, the error will return
-func (d *DynamicConfigurationServiceNameMapping) Get(serviceInterface string, 
group string, version string, protocol string) (*gxset.HashSet, error) {
-       return d.dc.GetConfigKeysByGroup(d.buildGroup(serviceInterface))
+func (d *MetadataServiceNameMapping) Get(url *common.URL) (*gxset.HashSet, 
error) {
+       serviceInterface := url.GetParam(constant.INTERFACE_KEY, "")
+       metadataReport := instance.GetMetadataReportInstance()
+       return metadataReport.GetServiceAppMapping(serviceInterface, 
defaultGroup)
 }
 
-// buildGroup will return group, now it looks like 
defaultGroup/serviceInterface
-func (d *DynamicConfigurationServiceNameMapping) buildGroup(serviceInterface 
string) string {
+// buildMappingKey will return mapping key, it looks like 
defaultGroup/serviceInterface
+func (d *MetadataServiceNameMapping) buildMappingKey(serviceInterface string) 
string {
        // the issue : https://github.com/apache/dubbo/issues/4671
        // so other params are ignored and remove, including group string, 
version string, protocol string
        return defaultGroup + slash + serviceInterface
 }
 
 var (
-       serviceNameMappingInstance *DynamicConfigurationServiceNameMapping
+       serviceNameMappingInstance *MetadataServiceNameMapping
        serviceNameMappingOnce     sync.Once
 )
 
 // GetNameMappingInstance return an instance, if not found, it creates one
 func GetNameMappingInstance() mapping.ServiceNameMapping {
        serviceNameMappingOnce.Do(func() {
-               dc := commonCfg.GetEnvInstance().GetDynamicConfiguration()
-               serviceNameMappingInstance = 
&DynamicConfigurationServiceNameMapping{dc: dc}
+               serviceNameMappingInstance = &MetadataServiceNameMapping{}
        })
        return serviceNameMappingInstance
 }
diff --git a/metadata/mapping/mock_service_name_mapping.go 
b/metadata/mapping/mock_service_name_mapping.go
index 14ee000..c3aae3d 100644
--- a/metadata/mapping/mock_service_name_mapping.go
+++ b/metadata/mapping/mock_service_name_mapping.go
@@ -21,16 +21,20 @@ import (
        gxset "github.com/dubbogo/gost/container/set"
 )
 
+import (
+       "dubbo.apache.org/dubbo-go/v3/common"
+)
+
 type MockServiceNameMapping struct{}
 
 func NewMockServiceNameMapping() *MockServiceNameMapping {
        return &MockServiceNameMapping{}
 }
 
-func (m *MockServiceNameMapping) Map(string, string, string, string) error {
+func (m *MockServiceNameMapping) Map(*common.URL) error {
        return nil
 }
 
-func (m *MockServiceNameMapping) Get(string, string, string, string) 
(*gxset.HashSet, error) {
+func (m *MockServiceNameMapping) Get(*common.URL) (*gxset.HashSet, error) {
        panic("implement me")
 }
diff --git a/metadata/mapping/service_name_mapping.go 
b/metadata/mapping/service_name_mapping.go
index 6caed9f..75b216f 100644
--- a/metadata/mapping/service_name_mapping.go
+++ b/metadata/mapping/service_name_mapping.go
@@ -21,12 +21,16 @@ import (
        gxset "github.com/dubbogo/gost/container/set"
 )
 
+import (
+       "dubbo.apache.org/dubbo-go/v3/common"
+)
+
 // ServiceNameMapping try to build the mapping between application-level 
service and interface-level service.
 type ServiceNameMapping interface {
 
        // Map will map the service to this application-level service
-       Map(serviceInterface string, group string, version string, protocol 
string) error
+       Map(url *common.URL) error
 
        // Get will return the application-level services
-       Get(serviceInterface string, group string, version string, protocol 
string) (*gxset.HashSet, error)
+       Get(url *common.URL) (*gxset.HashSet, error)
 }
diff --git a/metadata/report/etcd/report.go b/metadata/report/etcd/report.go
index 2d83fa3..7741e4b 100644
--- a/metadata/report/etcd/report.go
+++ b/metadata/report/etcd/report.go
@@ -23,7 +23,9 @@ import (
 )
 
 import (
+       gxset "github.com/dubbogo/gost/container/set"
        gxetcd "github.com/dubbogo/gost/database/kv/etcd/v3"
+       perrors "github.com/pkg/errors"
 )
 
 import (
@@ -141,6 +143,37 @@ func (e *etcdMetadataReport) 
GetServiceDefinition(metadataIdentifier *identifier
        return content, nil
 }
 
+// RegisterServiceAppMapping map the specified Dubbo service interface to 
current Dubbo app name
+func (e *etcdMetadataReport) RegisterServiceAppMapping(key string, group 
string, value string) error {
+       path := e.root + constant.PATH_SEPARATOR + group + 
constant.PATH_SEPARATOR + key
+       oldVal, err := e.client.Get(path)
+       if perrors.Cause(err) == gxetcd.ErrKVPairNotFound {
+               return e.client.Put(path, value)
+       } else if err != nil {
+               return err
+       }
+       if strings.Contains(oldVal, value) {
+               return nil
+       }
+       value = oldVal + constant.COMMA_SEPARATOR + value
+       return e.client.Put(path, value)
+}
+
+// GetServiceAppMapping get the app names from the specified Dubbo service 
interface
+func (e *etcdMetadataReport) GetServiceAppMapping(key string, group string) 
(*gxset.HashSet, error) {
+       path := e.root + constant.PATH_SEPARATOR + group + 
constant.PATH_SEPARATOR + key
+       v, err := e.client.Get(path)
+       if err != nil {
+               return nil, err
+       }
+       appNames := strings.Split(v, constant.COMMA_SEPARATOR)
+       set := gxset.NewSet()
+       for _, app := range appNames {
+               set.Add(app)
+       }
+       return set, nil
+}
+
 type etcdMetadataReportFactory struct{}
 
 // CreateMetadataReport get the MetadataReport instance of etcd
diff --git a/metadata/report/etcd/report_test.go 
b/metadata/report/etcd/report_test.go
index 81eece0..aed380b 100644
--- a/metadata/report/etcd/report_test.go
+++ b/metadata/report/etcd/report_test.go
@@ -114,6 +114,36 @@ func TestEtcdMetadataReport_CRUD(t *testing.T) {
        e.Close()
 }
 
+func TestEtcdMetadataReport_ServiceAppMapping(t *testing.T) {
+       e := initEtcd(t)
+       url, err := common.NewURL("registry://127.0.0.1:2379", 
common.WithParamsValue(constant.ROLE_KEY, strconv.Itoa(common.PROVIDER)))
+       if err != nil {
+               t.Fatal(err)
+       }
+       metadataReportFactory := &etcdMetadataReportFactory{}
+       metadataReport := metadataReportFactory.CreateMetadataReport(url)
+       assert.NotNil(t, metadataReport)
+
+       _, err = 
metadataReport.GetServiceAppMapping("com.apache.dubbo.sample.basic.IGreeter", 
"mapping")
+       assert.NotNil(t, err)
+
+       err = 
metadataReport.RegisterServiceAppMapping("com.apache.dubbo.sample.basic.IGreeter",
 "mapping", "demo_provider")
+       assert.Nil(t, err)
+       set, err := 
metadataReport.GetServiceAppMapping("com.apache.dubbo.sample.basic.IGreeter", 
"mapping")
+       assert.Nil(t, err)
+       assert.Equal(t, 1, set.Size())
+
+       err = 
metadataReport.RegisterServiceAppMapping("com.apache.dubbo.sample.basic.IGreeter",
 "mapping", "demo_provider2")
+       assert.Nil(t, err)
+       err = 
metadataReport.RegisterServiceAppMapping("com.apache.dubbo.sample.basic.IGreeter",
 "mapping", "demo_provider")
+       assert.Nil(t, err)
+       set, err = 
metadataReport.GetServiceAppMapping("com.apache.dubbo.sample.basic.IGreeter", 
"mapping")
+       assert.Nil(t, err)
+       assert.Equal(t, 2, set.Size())
+
+       e.Close()
+}
+
 func newSubscribeMetadataIdentifier() *identifier.SubscriberMetadataIdentifier 
{
        return &identifier.SubscriberMetadataIdentifier{
                Revision: "subscribe",
diff --git a/metadata/report/nacos/report.go b/metadata/report/nacos/report.go
index 30f68b8..37e17d2 100644
--- a/metadata/report/nacos/report.go
+++ b/metadata/report/nacos/report.go
@@ -20,9 +20,11 @@ package nacos
 import (
        "encoding/json"
        "net/url"
+       "strings"
 )
 
 import (
+       gxset "github.com/dubbogo/gost/container/set"
        nacosClient "github.com/dubbogo/gost/database/kv/nacos"
 
        "github.com/nacos-group/nacos-sdk-go/vo"
@@ -32,6 +34,7 @@ import (
 
 import (
        "dubbo.apache.org/dubbo-go/v3/common"
+       "dubbo.apache.org/dubbo-go/v3/common/constant"
        "dubbo.apache.org/dubbo-go/v3/common/extension"
        "dubbo.apache.org/dubbo-go/v3/common/logger"
        "dubbo.apache.org/dubbo-go/v3/metadata/identifier"
@@ -206,6 +209,48 @@ func (n *nacosMetadataReport) getConfig(param 
vo.ConfigParam) (string, error) {
        return cfg, nil
 }
 
+// RegisterServiceAppMapping map the specified Dubbo service interface to 
current Dubbo app name
+func (n *nacosMetadataReport) RegisterServiceAppMapping(key string, group 
string, value string) error {
+       oldVal, err := n.getConfig(vo.ConfigParam{
+               DataId: key,
+               Group:  group,
+       })
+       if err != nil {
+               return err
+       }
+       if strings.Contains(oldVal, value) {
+               return nil
+       }
+       if oldVal != "" {
+               value = oldVal + constant.COMMA_SEPARATOR + value
+       }
+       return n.storeMetadata(vo.ConfigParam{
+               DataId:  key,
+               Group:   group,
+               Content: value,
+       })
+}
+
+// GetServiceAppMapping get the app names from the specified Dubbo service 
interface
+func (n *nacosMetadataReport) GetServiceAppMapping(key string, group string) 
(*gxset.HashSet, error) {
+       v, err := n.getConfig(vo.ConfigParam{
+               DataId: key,
+               Group:  group,
+       })
+       if err != nil {
+               return nil, err
+       }
+       if v == "" {
+               return nil, perrors.New("There is no service app mapping data.")
+       }
+       appNames := strings.Split(v, constant.COMMA_SEPARATOR)
+       set := gxset.NewSet()
+       for _, e := range appNames {
+               set.Add(e)
+       }
+       return set, nil
+}
+
 type nacosMetadataReportFactory struct{}
 
 // nolint
diff --git a/metadata/report/report.go b/metadata/report/report.go
index 09c393e..ea748d2 100644
--- a/metadata/report/report.go
+++ b/metadata/report/report.go
@@ -18,6 +18,10 @@
 package report
 
 import (
+       gxset "github.com/dubbogo/gost/container/set"
+)
+
+import (
        "dubbo.apache.org/dubbo-go/v3/common"
        "dubbo.apache.org/dubbo-go/v3/metadata/identifier"
 )
@@ -63,4 +67,10 @@ type MetadataReport interface {
 
        // PublishAppMetadata publish metadata info to reportss
        PublishAppMetadata(*identifier.SubscriberMetadataIdentifier, 
*common.MetadataInfo) error
+
+       // RegisterServiceAppMapping map the specified Dubbo service interface 
to current Dubbo app name
+       RegisterServiceAppMapping(string, string, string) error
+
+       // GetServiceAppMapping get the app names from the specified Dubbo 
service interface
+       GetServiceAppMapping(string, string) (*gxset.HashSet, error)
 }
diff --git a/metadata/report/zookeeper/report.go 
b/metadata/report/zookeeper/report.go
index 68220c5..0e08a19 100644
--- a/metadata/report/zookeeper/report.go
+++ b/metadata/report/zookeeper/report.go
@@ -25,7 +25,7 @@ import (
 
 import (
        "github.com/dubbogo/go-zookeeper/zk"
-
+       gxset "github.com/dubbogo/gost/container/set"
        gxzookeeper "github.com/dubbogo/gost/database/kv/zk"
 )
 
@@ -142,6 +142,39 @@ func (m *zookeeperMetadataReport) 
GetServiceDefinition(metadataIdentifier *ident
        return string(v), err
 }
 
+// RegisterServiceAppMapping map the specified Dubbo service interface to 
current Dubbo app name
+func (m *zookeeperMetadataReport) RegisterServiceAppMapping(key string, group 
string, value string) error {
+       path := m.rootDir + group + constant.PATH_SEPARATOR + key
+       v, state, err := m.client.GetContent(path)
+       if err == zk.ErrNoNode {
+               return m.client.CreateWithValue(path, []byte(value))
+       } else if err != nil {
+               return err
+       }
+       oldValue := string(v)
+       if strings.Contains(oldValue, value) {
+               return nil
+       }
+       value = oldValue + constant.COMMA_SEPARATOR + value
+       _, err = m.client.SetContent(path, []byte(value), state.Version)
+       return err
+}
+
+// GetServiceAppMapping get the app names from the specified Dubbo service 
interface
+func (m *zookeeperMetadataReport) GetServiceAppMapping(key string, group 
string) (*gxset.HashSet, error) {
+       path := m.rootDir + group + constant.PATH_SEPARATOR + key
+       v, _, err := m.client.GetContent(path)
+       if err != nil {
+               return nil, err
+       }
+       appNames := strings.Split(string(v), constant.COMMA_SEPARATOR)
+       set := gxset.NewSet()
+       for _, e := range appNames {
+               set.Add(e)
+       }
+       return set, nil
+}
+
 type zookeeperMetadataReportFactory struct{}
 
 // nolint
diff --git a/metadata/service/exporter/configurable/exporter.go 
b/metadata/service/exporter/configurable/exporter.go
index 50d0485..feee948 100644
--- a/metadata/service/exporter/configurable/exporter.go
+++ b/metadata/service/exporter/configurable/exporter.go
@@ -31,7 +31,7 @@ import (
        "dubbo.apache.org/dubbo-go/v3/common/constant"
        "dubbo.apache.org/dubbo-go/v3/common/logger"
        "dubbo.apache.org/dubbo-go/v3/config"
-       _ "dubbo.apache.org/dubbo-go/v3/metadata/mapping/dynamic"
+       _ "dubbo.apache.org/dubbo-go/v3/metadata/mapping/metadata"
        "dubbo.apache.org/dubbo-go/v3/metadata/service"
        "dubbo.apache.org/dubbo-go/v3/metadata/service/exporter"
        _ "dubbo.apache.org/dubbo-go/v3/metadata/service/remote"
diff --git a/metadata/service/remote/service_test.go 
b/metadata/service/remote/service_test.go
index 938a860..fc46367 100644
--- a/metadata/service/remote/service_test.go
+++ b/metadata/service/remote/service_test.go
@@ -23,6 +23,7 @@ import (
 )
 
 import (
+       gxset "github.com/dubbogo/gost/container/set"
        "github.com/stretchr/testify/assert"
 )
 
@@ -55,11 +56,19 @@ func (mrf *metadataReportFactory) 
CreateMetadataReport(*common.URL) report.Metad
 
 type metadataReport struct{}
 
-func (mr metadataReport) GetAppMetadata(metadataIdentifier 
*identifier.SubscriberMetadataIdentifier) (*common.MetadataInfo, error) {
+func (mr metadataReport) RegisterServiceAppMapping(string, string, string) 
error {
        panic("implement me")
 }
 
-func (mr metadataReport) PublishAppMetadata(metadataIdentifier 
*identifier.SubscriberMetadataIdentifier, info *common.MetadataInfo) error {
+func (mr metadataReport) GetServiceAppMapping(string, string) (*gxset.HashSet, 
error) {
+       panic("implement me")
+}
+
+func (mr metadataReport) 
GetAppMetadata(*identifier.SubscriberMetadataIdentifier) (*common.MetadataInfo, 
error) {
+       panic("implement me")
+}
+
+func (mr metadataReport) 
PublishAppMetadata(*identifier.SubscriberMetadataIdentifier, 
*common.MetadataInfo) error {
        panic("implement me")
 }
 
diff --git a/registry/event/event_publishing_service_deiscovery_test.go 
b/registry/event/event_publishing_service_discovery_test.go
similarity index 100%
rename from registry/event/event_publishing_service_deiscovery_test.go
rename to registry/event/event_publishing_service_discovery_test.go
diff --git a/registry/event/service_name_mapping_listener.go 
b/registry/event/service_name_mapping_listener.go
index e7d979a..f2dfaf9 100644
--- a/registry/event/service_name_mapping_listener.go
+++ b/registry/event/service_name_mapping_listener.go
@@ -27,7 +27,6 @@ import (
 )
 
 import (
-       "dubbo.apache.org/dubbo-go/v3/common/constant"
        "dubbo.apache.org/dubbo-go/v3/common/extension"
        "dubbo.apache.org/dubbo-go/v3/common/observer"
        "dubbo.apache.org/dubbo-go/v3/metadata/mapping"
@@ -55,13 +54,10 @@ func (s *serviceNameMappingListener) OnEvent(e 
observer.Event) error {
                sc := ex.ServiceConfig
                urls := sc.GetExportedUrls()
 
-               for _, u := range urls {
-                       err := 
s.nameMapping.Map(u.GetParam(constant.INTERFACE_KEY, ""),
-                               u.GetParam(constant.GROUP_KEY, ""),
-                               u.GetParam(constant.Version, ""),
-                               u.Protocol)
+               for _, url := range urls {
+                       err := s.nameMapping.Map(url)
                        if err != nil {
-                               return perrors.WithMessage(err, "could not map 
the service: "+u.String())
+                               return perrors.WithMessage(err, "could not map 
the service: "+url.String())
                        }
                }
        }
diff --git a/registry/servicediscovery/service_discovery_registry.go 
b/registry/servicediscovery/service_discovery_registry.go
index 655c8a1..ba66a3f 100644
--- a/registry/servicediscovery/service_discovery_registry.go
+++ b/registry/servicediscovery/service_discovery_registry.go
@@ -181,10 +181,7 @@ func (s *serviceDiscoveryRegistry) Register(url 
*common.URL) error {
                logger.Warnf("The URL[%s] has been registry!", url.String())
        }
 
-       return s.serviceNameMapping.Map(url.GetParam(constant.INTERFACE_KEY, 
""),
-               url.GetParam(constant.GROUP_KEY, ""),
-               url.GetParam(constant.Version, ""),
-               url.Protocol)
+       return s.serviceNameMapping.Map(url)
 }
 
 func shouldRegister(url *common.URL) bool {
@@ -303,14 +300,9 @@ func (s *serviceDiscoveryRegistry) getServices(url 
*common.URL) *gxset.HashSet {
 }
 
 func (s *serviceDiscoveryRegistry) findMappedServices(url *common.URL) 
*gxset.HashSet {
-       serviceInterface := url.GetParam(constant.INTERFACE_KEY, url.Path)
-       group := url.GetParam(constant.GROUP_KEY, "")
-       version := url.GetParam(constant.VERSION_KEY, "")
-       protocol := url.Protocol
-       serviceNames, err := s.serviceNameMapping.Get(serviceInterface, group, 
version, protocol)
+       serviceNames, err := s.serviceNameMapping.Get(url)
        if err != nil {
-               logger.Errorf("get serviceInterface:[%s] group:[%s] 
version:[%s] protocol:[%s] from "+
-                       "serviceNameMap error:%s", err.Error())
+               logger.Errorf("get service names catch error, url:%s, err:%s ", 
url.String(), err.Error())
                return gxset.NewSet()
        }
        return serviceNames

Reply via email to