diff --git a/common/extension/metadata_service.go b/common/extension/metadata_service.go
new file mode 100644
index 0000000000000000000000000000000000000000..c6a165c487b11781d1dbdc6d0369eaf06b0b7329
--- /dev/null
+++ b/common/extension/metadata_service.go
@@ -0,0 +1,42 @@
+/*
+ * 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 extension
+
+import (
+	"fmt"
+
+	"github.com/apache/dubbo-go/metadata/service"
+)
+
+var (
+	// there will be two types: local or remote
+	metadataServiceInsMap = make(map[string]func() (service.MetadataService, error), 2)
+)
+
+func SetMetadataService(msType string, creator func() (service.MetadataService, error)) {
+	metadataServiceInsMap[msType] = creator
+}
+
+func GetMetadataService(msType string) (service.MetadataService, error) {
+	if creator, ok := metadataServiceInsMap[msType]; ok {
+		return creator()
+	}
+	panic(fmt.Sprintf("could not find the creator for metadataType: %s, please check whether you have imported relative packages, \n"+
+		"local - github.com/apache/dubbo-go/metadata/service/inmemory, \n"+
+		"remote - github.com/apache/dubbo-go/metadata/service/remote", msType))
+}
diff --git a/common/rpc_service_test.go b/common/rpc_service_test.go
index 19a1d7b03b48d16d9d75b649d603d5d22ee7ba56..2311205d0ec0c2fd4642a4d8639c0bf871fe1d17 100644
--- a/common/rpc_service_test.go
+++ b/common/rpc_service_test.go
@@ -137,7 +137,7 @@ func TestSuiteMethod(t *testing.T) {
 	assert.True(t, ok)
 	methodType := suiteMethod(method)
 	method = methodType.Method()
-	assert.Equal(t, "func(*event.TestService, context.Context, interface {}, interface {}, interface {}) error", method.Type.String())
+	assert.Equal(t, "func(*common.TestService, context.Context, interface {}, interface {}, interface {}) error", method.Type.String())
 	at := methodType.ArgsType()
 	assert.Equal(t, "interface {}", at[0].String())
 	assert.Equal(t, "interface {}", at[1].String())
@@ -151,7 +151,7 @@ func TestSuiteMethod(t *testing.T) {
 	assert.True(t, ok)
 	methodType = suiteMethod(method)
 	method = methodType.Method()
-	assert.Equal(t, "func(*event.TestService, interface {}, interface {}, interface {}) (interface {}, error)", method.Type.String())
+	assert.Equal(t, "func(*common.TestService, interface {}, interface {}, interface {}) (interface {}, error)", method.Type.String())
 	at = methodType.ArgsType()
 	assert.Equal(t, "interface {}", at[0].String())
 	assert.Equal(t, "interface {}", at[1].String())
@@ -164,7 +164,7 @@ func TestSuiteMethod(t *testing.T) {
 	assert.True(t, ok)
 	methodType = suiteMethod(method)
 	method = methodType.Method()
-	assert.Equal(t, "func(*event.TestService) error", method.Type.String())
+	assert.Equal(t, "func(*common.TestService) error", method.Type.String())
 	at = methodType.ArgsType()
 	assert.Equal(t, 0, len(at))
 	assert.Nil(t, methodType.CtxType())
diff --git a/config/service_config.go b/config/service_config.go
index 2b1e5a1a3f1e708831f8f969706088d2db0512a5..43c53bc9c2b596a9270c2e1e0c0ccfa71bb15ee4 100644
--- a/config/service_config.go
+++ b/config/service_config.go
@@ -44,7 +44,9 @@ import (
 	"github.com/apache/dubbo-go/protocol/protocolwrapper"
 )
 
-// ServiceConfig ...
+// ServiceConfig is a newest structure to support Dubbo 2.7.5
+// But I think it's not very necessary,
+// we should think about how to reuse current ProviderConfig rather than use this
 type ServiceConfig struct {
 	context                     context.Context
 	id                          string
diff --git a/metadata/mapping/dynamic/service_name_mapping.go b/metadata/mapping/dynamic/service_name_mapping.go
index 56ef2a0f0d30ebb8f68a480d7631fbe2068e30bc..9f65adf7397db487ce2cbc9abe58d4d61d97d84a 100644
--- a/metadata/mapping/dynamic/service_name_mapping.go
+++ b/metadata/mapping/dynamic/service_name_mapping.go
@@ -21,7 +21,9 @@ import (
 	"strconv"
 	"time"
 
+
 	"github.com/apache/dubbo-go/common/extension"
+	"github.com/apache/dubbo-go/common/logger"
 )
 
 import (
@@ -55,7 +57,8 @@ type DynamicConfigurationServiceNameMapping struct {
 func (d *DynamicConfigurationServiceNameMapping) Map(serviceInterface string, group string, version string, protocol string) error {
 	// metadata service is admin service, should not be mapped
 	if constant.METADATA_SERVICE_NAME == serviceInterface {
-		return perrors.New("try to map the metadata service, will be ignored")
+		logger.Info("try to map the metadata service, will be ignored")
+		return nil
 	}
 
 	appName := config.GetApplicationConfig().Name
diff --git a/metadata/mapping/dynamic/service_name_mapping_test.go b/metadata/mapping/dynamic/service_name_mapping_test.go
index 647a15ae78c3a29a3ea58c507ca6b84e8d54b466..2896b0fd4aa4fb6bada132c276c70a1653e59f99 100644
--- a/metadata/mapping/dynamic/service_name_mapping_test.go
+++ b/metadata/mapping/dynamic/service_name_mapping_test.go
@@ -48,7 +48,7 @@ func TestDynamicConfigurationServiceNameMapping(t *testing.T) {
 	protocol := "myProtocol"
 
 	err = mapping.Map(intf, group, version, protocol)
-	assert.NotNil(t, err)
+	assert.Nil(t, err)
 	intf = "MyService"
 	err = mapping.Map(intf, group, version, protocol)
 	assert.Nil(t, err)
diff --git a/metadata/report/nacos/report.go b/metadata/report/nacos/report.go
index 5eaee7bb2b34bcfef8a4cea2fe117c216bb37be0..6b838187b7b5518296255814c48aaf665540b827 100644
--- a/metadata/report/nacos/report.go
+++ b/metadata/report/nacos/report.go
@@ -181,7 +181,7 @@ func (n *nacosMetadataReport) getConfigAsArray(param vo.ConfigParam) []string {
 func (n *nacosMetadataReport) getConfig(param vo.ConfigParam) string {
 	cfg, err := n.client.GetConfig(param)
 	if err != nil {
-		logger.Errorf("Finding the configuration failed: %v", param)
+		logger.Errorf("Finding the configuration failed: %v, err: %v", param, err)
 	}
 	return cfg
 }
diff --git a/metadata/report/nacos/report_test.go b/metadata/report/nacos/report_test.go
index 711e6281a295005501ad9384f6fc3433c2e2830d..f23ed8a8dada160bdda8efdda5a35480cddd1d52 100644
--- a/metadata/report/nacos/report_test.go
+++ b/metadata/report/nacos/report_test.go
@@ -44,7 +44,7 @@ func TestNacosMetadataReport_CRUD(t *testing.T) {
 	assert.Nil(t, err)
 
 	serviceMi := newServiceMetadataIdentifier()
-	serviceUrl, _ := common.NewURL("registry://console.nacos.io:80", common.WithParamsValue(constant.ROLE_KEY, strconv.Itoa(common.PROVIDER)))
+	serviceUrl, _ := common.NewURL("registry://localhost:8848", common.WithParamsValue(constant.ROLE_KEY, strconv.Itoa(common.PROVIDER)))
 
 	err = rpt.SaveServiceMetadata(serviceMi, serviceUrl)
 	assert.Nil(t, err)
diff --git a/metadata/service/exporter/configurable/exporter.go b/metadata/service/exporter/configurable/exporter.go
index ec3f8ec2d0a6f5baacfe962d06fe50fcf634a981..1d134bdb3d81f7cb3fd5f00dab5e5e663ed0cfec 100644
--- a/metadata/service/exporter/configurable/exporter.go
+++ b/metadata/service/exporter/configurable/exporter.go
@@ -33,7 +33,7 @@ import (
 
 // MetadataServiceExporter is the ConfigurableMetadataServiceExporter which implement MetadataServiceExporter interface
 type MetadataServiceExporter struct {
-	serviceConfig   *config.ServiceConfig
+	ServiceConfig   *config.ServiceConfig
 	lock            sync.RWMutex
 	metadataService service.MetadataService
 }
@@ -56,42 +56,43 @@ func (exporter *MetadataServiceExporter) Export() error {
 		}
 		serviceConfig.InterfaceName = constant.METADATA_SERVICE_NAME
 		serviceConfig.Group = config.GetApplicationConfig().Name
-		serviceConfig.Version = exporter.metadataService.Version()
+		// now the error will always be nil
+		serviceConfig.Version, _ = exporter.metadataService.Version()
 
 		var err error
 		func() {
 			exporter.lock.Lock()
 			defer exporter.lock.Unlock()
-			exporter.serviceConfig = serviceConfig
-			exporter.serviceConfig.Implement(exporter.metadataService)
-			err = exporter.serviceConfig.Export()
+			exporter.ServiceConfig = serviceConfig
+			exporter.ServiceConfig.Implement(exporter.metadataService)
+			err = exporter.ServiceConfig.Export()
 		}()
 
-		logger.Infof("The MetadataService exports urls : %v ", exporter.serviceConfig.GetExportedUrls())
+		logger.Infof("The MetadataService exports urls : %v ", exporter.ServiceConfig.GetExportedUrls())
 		return err
 	}
-	logger.Warnf("The MetadataService has been exported : %v ", exporter.serviceConfig.GetExportedUrls())
+	logger.Warnf("The MetadataService has been exported : %v ", exporter.ServiceConfig.GetExportedUrls())
 	return nil
 }
 
 // Unexport will unexport the metadataService
 func (exporter *MetadataServiceExporter) Unexport() {
 	if exporter.IsExported() {
-		exporter.serviceConfig.Unexport()
+		exporter.ServiceConfig.Unexport()
 	}
 }
 
 // GetExportedURLs will return the urls that export use.
 // Notice!The exported url is not same as url in registry , for example it lack the ip.
 func (exporter *MetadataServiceExporter) GetExportedURLs() []*common.URL {
-	return exporter.serviceConfig.GetExportedUrls()
+	return exporter.ServiceConfig.GetExportedUrls()
 }
 
 // isExported will return is metadataServiceExporter exported or not
 func (exporter *MetadataServiceExporter) IsExported() bool {
 	exporter.lock.RLock()
 	defer exporter.lock.RUnlock()
-	return exporter.serviceConfig != nil && exporter.serviceConfig.IsExport()
+	return exporter.ServiceConfig != nil && exporter.ServiceConfig.IsExport()
 }
 
 // generateMetadataProtocol will return a default ProtocolConfig
diff --git a/metadata/service/exporter/configurable/exporter_test.go b/metadata/service/exporter/configurable/exporter_test.go
index 364169b3174969267627a61476164dd736cf6f36..20a80ef70851fdf04859e900946c0ee27d53c9f0 100644
--- a/metadata/service/exporter/configurable/exporter_test.go
+++ b/metadata/service/exporter/configurable/exporter_test.go
@@ -53,7 +53,7 @@ func TestConfigurableExporter(t *testing.T) {
 			SessionName:      "server",
 		}})
 	mockInitProviderWithSingleRegistry()
-	metadataService := inmemory.NewMetadataService()
+	metadataService, _ := inmemory.NewMetadataService()
 	exported := NewMetadataServiceExporter(metadataService)
 	assert.Equal(t, false, exported.IsExported())
 	assert.NoError(t, exported.Export())
diff --git a/metadata/service/inmemory/service.go b/metadata/service/inmemory/service.go
index f7b7466a3d7d994810520fc7fc0ba7f119eeb9da..4327304ad36d86560172ffe664a261581ba30611 100644
--- a/metadata/service/inmemory/service.go
+++ b/metadata/service/inmemory/service.go
@@ -19,6 +19,9 @@ package inmemory
 import (
 	"sort"
 	"sync"
+
+	"github.com/apache/dubbo-go/common/extension"
+	"github.com/apache/dubbo-go/config"
 )
 
 import (
@@ -34,6 +37,10 @@ import (
 	"github.com/apache/dubbo-go/metadata/service"
 )
 
+func init() {
+	extension.SetMetadataService("local", NewMetadataService)
+}
+
 // version will be used by Version func
 const version = "1.0.0"
 
@@ -47,13 +54,14 @@ type MetadataService struct {
 }
 
 // NewMetadataService: initiate a metadata service
-func NewMetadataService() *MetadataService {
+func NewMetadataService() (service.MetadataService, error) {
 	return &MetadataService{
+		BaseMetadataService: service.NewBaseMetadataService(config.GetApplicationConfig().Name),
 		exportedServiceURLs:   &sync.Map{},
 		subscribedServiceURLs: &sync.Map{},
 		serviceDefinitions:    &sync.Map{},
 		lock:                  &sync.RWMutex{},
-	}
+	}, nil
 }
 
 // Comparator is defined as Comparator for skip list to compare the URL
@@ -228,11 +236,11 @@ func (mts *MetadataService) GetServiceDefinitionByServiceKey(serviceKey string)
 }
 
 // RefreshMetadata will always return true because it will be implement by remote service
-func (mts *MetadataService) RefreshMetadata(exportedRevision string, subscribedRevision string) bool {
-	return true
+func (mts *MetadataService) RefreshMetadata(exportedRevision string, subscribedRevision string) (bool, error) {
+	return true, nil
 }
 
 // Version will return the version of metadata service
-func (mts *MetadataService) Version() string {
-	return version
+func (mts *MetadataService) Version() (string, error) {
+	return version, nil
 }
diff --git a/metadata/service/inmemory/service_test.go b/metadata/service/inmemory/service_test.go
index fc0410ecca9f83502017bca94ba706abb8ee14be..048c286fdf28fba6a15a86164df0789d421f0797 100644
--- a/metadata/service/inmemory/service_test.go
+++ b/metadata/service/inmemory/service_test.go
@@ -32,7 +32,7 @@ import (
 )
 
 func TestMetadataService(t *testing.T) {
-	mts := NewMetadataService()
+	mts, _ := NewMetadataService()
 	serviceName := "com.ikurento.user.UserProvider"
 	group := "group1"
 	version := "0.0.1"
@@ -66,25 +66,20 @@ func TestMetadataService(t *testing.T) {
 	assert.NoError(t, err)
 	mts.ExportURL(u)
 	list, _ := mts.GetExportedURLs(serviceName, group, version, protocol)
-	assert.Equal(t, uint64(3), list.Len())
-	iter := list.IterAtPosition(0)
-	for iter.Next() {
-		comparator := iter.Value()
-		fmt.Println(comparator)
-	}
+	assert.Equal(t, 3, len(list))
 	mts.SubscribeURL(u)
 
 	mts.SubscribeURL(u)
 	list2, _ := mts.GetSubscribedURLs()
-	assert.Equal(t, uint64(1), list2.Len())
+	assert.Equal(t, 1, len(list2))
 
 	mts.UnexportURL(u)
 	list3, _ := mts.GetExportedURLs(serviceName, group, version, protocol)
-	assert.Equal(t, uint64(2), list3.Len())
+	assert.Equal(t, 2, len(list3))
 
 	mts.UnsubscribeURL(u)
 	list4, _ := mts.GetSubscribedURLs()
-	assert.Equal(t, uint64(0), list4.Len())
+	assert.Equal(t, 0, len(list4))
 
 	userProvider := &definition.UserProvider{}
 	common.ServiceMap.Register(serviceName, protocol, userProvider)
diff --git a/metadata/service/remote/service.go b/metadata/service/remote/service.go
index 6726b1000a262f6450d457a4e08c89cd8b995e4a..2e8f66444f346aba8491ad02292eb2d60c97d07b 100644
--- a/metadata/service/remote/service.go
+++ b/metadata/service/remote/service.go
@@ -21,6 +21,8 @@ import (
 	"sync"
 
 	"go.uber.org/atomic"
+
+	"github.com/apache/dubbo-go/common/extension"
 )
 
 import (
@@ -38,6 +40,10 @@ import (
 // version will be used by Version func
 const version = "1.0.0"
 
+func init() {
+	extension.SetMetadataService("remote", newMetadataService)
+}
+
 // MetadataService is a implement of metadata service which will delegate the remote metadata report
 // This is singleton
 type MetadataService struct {
@@ -53,8 +59,8 @@ var (
 	metadataServiceInstance *MetadataService
 )
 
-// NewMetadataService will create a new remote MetadataService instance
-func NewMetadataService() (*MetadataService, error) {
+// newMetadataService will create a new remote MetadataService instance
+func newMetadataService() (service.MetadataService, error) {
 	var err error
 	metadataServiceOnce.Do(func() {
 		var mr *delegate.MetadataReport
@@ -62,8 +68,11 @@ func NewMetadataService() (*MetadataService, error) {
 		if err != nil {
 			return
 		}
+		// it will never return error
+		inms, _ := inmemory.NewMetadataService()
 		metadataServiceInstance = &MetadataService{
-			inMemoryMetadataService: inmemory.NewMetadataService(),
+			BaseMetadataService:     service.NewBaseMetadataService(config.GetApplicationConfig().Name),
+			inMemoryMetadataService: inms.(*inmemory.MetadataService),
 			delegateReport:          mr,
 		}
 	})
@@ -140,14 +149,13 @@ func (mts *MetadataService) GetServiceDefinitionByServiceKey(serviceKey string)
 }
 
 // RefreshMetadata will refresh the exported & subscribed metadata to remote metadata report from the inmemory metadata service
-func (mts *MetadataService) RefreshMetadata(exportedRevision string, subscribedRevision string) bool {
-	result := true
+func (mts *MetadataService) RefreshMetadata(exportedRevision string, subscribedRevision string) (bool, error) {
 	if len(exportedRevision) != 0 && exportedRevision != mts.exportedRevision.Load() {
 		mts.exportedRevision.Store(exportedRevision)
 		urls, err := mts.inMemoryMetadataService.GetExportedURLs(constant.ANY_VALUE, "", "", "")
 		if err != nil {
 			logger.Errorf("Error occur when execute remote.MetadataService.RefreshMetadata, error message is %+v", err)
-			result = false
+			return false, err
 		}
 		logger.Infof("urls length = %v", len(urls))
 		for _, u := range urls {
@@ -155,7 +163,7 @@ func (mts *MetadataService) RefreshMetadata(exportedRevision string, subscribedR
 			id.Revision = mts.exportedRevision.Load()
 			if err := mts.delegateReport.SaveServiceMetadata(id, u); err != nil {
 				logger.Errorf("Error occur when execute remote.MetadataService.RefreshMetadata, error message is %+v", err)
-				result = false
+				return false, err
 			}
 		}
 	}
@@ -165,7 +173,7 @@ func (mts *MetadataService) RefreshMetadata(exportedRevision string, subscribedR
 		urls, err := mts.inMemoryMetadataService.GetSubscribedURLs()
 		if err != nil {
 			logger.Errorf("Error occur when execute remote.MetadataService.RefreshMetadata, error message is %v+", err)
-			result = false
+			return false, err
 		}
 		if urls != nil && len(urls) > 0 {
 			id := &identifier.SubscriberMetadataIdentifier{
@@ -176,14 +184,14 @@ func (mts *MetadataService) RefreshMetadata(exportedRevision string, subscribedR
 			}
 			if err := mts.delegateReport.SaveSubscribedData(id, urls); err != nil {
 				logger.Errorf("Error occur when execute remote.MetadataService.RefreshMetadata, error message is %+v", err)
-				result = false
+				return false, err
 			}
 		}
 	}
-	return result
+	return true, nil
 }
 
 // Version will return the remote service version
-func (MetadataService) Version() string {
-	return version
+func (MetadataService) Version() (string, error) {
+	return version, nil
 }
diff --git a/metadata/service/remote/service_test.go b/metadata/service/remote/service_test.go
index 308c631e413be9c3c6735f31c56da2e8f0697333..2bf1c4c6c00f0cf4b6b6d0eefc3274e081c3cef2 100644
--- a/metadata/service/remote/service_test.go
+++ b/metadata/service/remote/service_test.go
@@ -97,16 +97,16 @@ func TestMetadataService(t *testing.T) {
 		"mock://127.0.0.1:20000/?sync.report=true"))
 	assert.NoError(t, err)
 	instance.GetMetadataReportInstance(&u)
-	mts, err := NewMetadataService()
+	mts, err := newMetadataService()
 	assert.NoError(t, err)
-	mts.setInMemoryMetadataService(mockInmemoryProc(t))
+	mts.(*MetadataService).setInMemoryMetadataService(mockInmemoryProc(t))
 	mts.RefreshMetadata("0.0.1", "0.0.1")
 	assert.Equal(t, 1, len(serviceMetadata))
 	assert.Equal(t, 1, len(subscribedMetadata))
 }
 
 func mockInmemoryProc(t *testing.T) *inmemory.MetadataService {
-	mts := inmemory.NewMetadataService()
+	mts, _ := inmemory.NewMetadataService()
 	serviceName := "com.ikurento.user.UserProvider"
 	group := "group1"
 	version := "0.0.1"
@@ -135,5 +135,5 @@ func mockInmemoryProc(t *testing.T) *inmemory.MetadataService {
 	serviceKey := definition.ServiceDescriperBuild(serviceName, group, version)
 	def2, _ := mts.GetServiceDefinitionByServiceKey(serviceKey)
 	assert.Equal(t, expected, def2)
-	return mts
+	return mts.(*inmemory.MetadataService)
 }
diff --git a/metadata/service/service.go b/metadata/service/service.go
index af9528c68bcdacc1d10f1729d6da92a939d006ac..e05b634f8c18fa09876a3292ccb8a4151bf4a7d8 100644
--- a/metadata/service/service.go
+++ b/metadata/service/service.go
@@ -20,7 +20,6 @@ package service
 import (
 	"github.com/apache/dubbo-go/common"
 	"github.com/apache/dubbo-go/common/constant"
-	"github.com/apache/dubbo-go/config"
 )
 
 // MetadataService is used to define meta data related behaviors
@@ -50,18 +49,25 @@ type MetadataService interface {
 	// GetServiceDefinition will get the target service info store in metadata by service key
 	GetServiceDefinitionByServiceKey(serviceKey string) (string, error)
 	// RefreshMetadata will refresh the metadata
-	RefreshMetadata(exportedRevision string, subscribedRevision string) bool
+	RefreshMetadata(exportedRevision string, subscribedRevision string) (bool, error)
 	// Version will return the metadata service version
-	Version() string
+	Version() (string, error)
 }
 
 // BaseMetadataService is used for the event logic for struct who will implement interface MetadataService
 type BaseMetadataService struct {
+	serviceName string
+}
+
+func NewBaseMetadataService(serviceName string) BaseMetadataService {
+	return BaseMetadataService{
+		serviceName: serviceName,
+	}
 }
 
 // ServiceName can get the service's name in meta service , which is application name
 func (mts *BaseMetadataService) ServiceName() (string, error) {
-	return config.GetApplicationConfig().Name, nil
+	return mts.serviceName, nil
 }
 
 // Version will return the version of metadata service
diff --git a/registry/event/event_publishing_service_discovery.go b/registry/event/event_publishing_service_discovery.go
index 76fdf7237a9b566a5d6add3b1e4dae757793098c..496eb9b4a51f1451fb4e4200325108d6dcd08b75 100644
--- a/registry/event/event_publishing_service_discovery.go
+++ b/registry/event/event_publishing_service_discovery.go
@@ -20,6 +20,9 @@ package event
 import (
 	gxset "github.com/dubbogo/gost/container/set"
 	gxpage "github.com/dubbogo/gost/page"
+
+	"github.com/apache/dubbo-go/config"
+	"github.com/apache/dubbo-go/metadata/service"
 )
 
 import (
@@ -139,3 +142,7 @@ func (epsd *EventPublishingServiceDiscovery) executeWithEvents(beforeEvent obser
 	}
 	return nil
 }
+
+func getMetadataService() (service.MetadataService, error) {
+	return extension.GetMetadataService(config.GetApplicationConfig().MetadataType)
+}
diff --git a/registry/event/log_event_listener_test.go b/registry/event/log_event_listener_test.go
index e7c0ba0df56f637cafa9568913d48dc6e562d5a5..f142168b65759455a1c46e3aa8dbb537298443bf 100644
--- a/registry/event/log_event_listener_test.go
+++ b/registry/event/log_event_listener_test.go
@@ -26,6 +26,5 @@ import (
 func TestLogEventListener(t *testing.T) {
 	l := &logEventListener{}
 	assert.Equal(t, 0, l.GetPriority())
-	assert.Nil(t, l.GetEventType())
 	assert.Nil(t, l.OnEvent(&ServiceDiscoveryDestroyedEvent{}))
 }
diff --git a/registry/event/metadata_service_url_params_customizer.go b/registry/event/metadata_service_url_params_customizer.go
index c9c636448c334b5cee7c4fa37d842671c2957ad1..e5ff2bc26f58f59a4741afd88178d118036937b3 100644
--- a/registry/event/metadata_service_url_params_customizer.go
+++ b/registry/event/metadata_service_url_params_customizer.go
@@ -26,7 +26,6 @@ import (
 	"github.com/apache/dubbo-go/common/constant"
 	"github.com/apache/dubbo-go/common/extension"
 	"github.com/apache/dubbo-go/common/logger"
-	"github.com/apache/dubbo-go/metadata/service/remote"
 	"github.com/apache/dubbo-go/registry"
 )
 
@@ -52,17 +51,18 @@ func (m *metadataServiceURLParamsMetadataCustomizer) GetPriority() int {
 }
 
 func (m *metadataServiceURLParamsMetadataCustomizer) Customize(instance registry.ServiceInstance) {
-	ms, err := remote.NewMetadataService()
+	ms, err := getMetadataService()
 	if err != nil {
 		logger.Errorf("could not find the metadata service", err)
 		return
 	}
 	serviceName := constant.METADATA_SERVICE_NAME
-	version := ms.Version()
+	// error always is nil
+	version, _ := ms.Version()
 	group := instance.GetServiceName()
 	urls, err := ms.GetExportedURLs(serviceName, group, version, constant.ANY_VALUE)
 	if err != nil || len(urls) == 0 {
-		logger.Errorf("could not find the exported urls", err)
+		logger.Info("could not find the exported urls", err)
 		return
 	}
 	ps := m.convertToParams(urls)
diff --git a/registry/event/protocol_ports_metadata_customizer.go b/registry/event/protocol_ports_metadata_customizer.go
index 975463fe3e86af3af9a3a80122fd4e86ab53159b..be2e381194f8b5d8f16ea54aef622434552d486a 100644
--- a/registry/event/protocol_ports_metadata_customizer.go
+++ b/registry/event/protocol_ports_metadata_customizer.go
@@ -23,7 +23,6 @@ import (
 
 	"github.com/apache/dubbo-go/common/constant"
 	"github.com/apache/dubbo-go/common/logger"
-	"github.com/apache/dubbo-go/metadata/service/remote"
 	"github.com/apache/dubbo-go/registry"
 )
 
@@ -38,7 +37,7 @@ func (p *ProtocolPortsMetadataCustomizer) GetPriority() int {
 
 // Customize will
 func (p *ProtocolPortsMetadataCustomizer) Customize(instance registry.ServiceInstance) {
-	metadataService, err := remote.NewMetadataService()
+	metadataService, err := getMetadataService()
 	if err != nil {
 		logger.Errorf("Could not init the MetadataService", err)
 		return
diff --git a/registry/event/service_config_exported_event.go b/registry/event/service_config_exported_event.go
index 371f72d0db490a059f6343c2ce6b3eb06647b746..c3d8eee9206b3a94cc6bb8b1f51cc019db456d23 100644
--- a/registry/event/service_config_exported_event.go
+++ b/registry/event/service_config_exported_event.go
@@ -18,11 +18,24 @@
 package event
 
 import (
+	"time"
+
 	"github.com/apache/dubbo-go/common/observer"
 	"github.com/apache/dubbo-go/config"
 )
 
 type ServiceConfigExportedEvent struct {
 	observer.BaseEvent
-	ServiceConfig config.ServiceConfig
+	ServiceConfig *config.ServiceConfig
+}
+
+func NewServiceConfigExportedEvent(serviceConfig *config.ServiceConfig) *ServiceConfigExportedEvent {
+	return &ServiceConfigExportedEvent{
+		BaseEvent:     observer.BaseEvent{
+			Source:serviceConfig,
+			Timestamp:time.Now(),
+		},
+		ServiceConfig: serviceConfig,
+	}
 }
+
diff --git a/registry/event/service_name_mapping_listener.go b/registry/event/service_name_mapping_listener.go
index 9ec7392b17a38e3f88d6240ab6fcca718705353c..480c51cc55c9acb7dcb1b91cf4c3bbf944d1867b 100644
--- a/registry/event/service_name_mapping_listener.go
+++ b/registry/event/service_name_mapping_listener.go
@@ -20,6 +20,9 @@ package event
 import (
 	"reflect"
 
+	perrors "github.com/pkg/errors"
+
+	"github.com/apache/dubbo-go/common/constant"
 	"github.com/apache/dubbo-go/common/extension"
 	"github.com/apache/dubbo-go/common/observer"
 	"github.com/apache/dubbo-go/metadata/mapping"
@@ -43,6 +46,17 @@ func (s *serviceNameMappingListener) GetPriority() int {
 func (s *serviceNameMappingListener) OnEvent(e observer.Event) error {
 	if ex, ok := e.(*ServiceConfigExportedEvent); ok {
 		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)
+			if err != nil {
+				return perrors.WithMessage(err, "could not map the service: "+u.String())
+			}
+		}
 	}
 	return nil
 }
diff --git a/registry/event/service_revision_customizer.go b/registry/event/service_revision_customizer.go
index 51475d06c480114210b1e67a2b4dd913d9515eeb..f51a955810f50da55dfc7b60d28ff9299865e26c 100644
--- a/registry/event/service_revision_customizer.go
+++ b/registry/event/service_revision_customizer.go
@@ -26,7 +26,6 @@ import (
 	"github.com/apache/dubbo-go/common/constant"
 	"github.com/apache/dubbo-go/common/extension"
 	"github.com/apache/dubbo-go/common/logger"
-	"github.com/apache/dubbo-go/metadata/service/remote"
 	"github.com/apache/dubbo-go/registry"
 )
 
@@ -46,7 +45,7 @@ func (e *exportedServicesRevisionMetadataCustomizer) GetPriority() int {
 }
 
 func (e *exportedServicesRevisionMetadataCustomizer) Customize(instance registry.ServiceInstance) {
-	ms, err := remote.NewMetadataService()
+	ms, err := getMetadataService()
 	if err != nil {
 		logger.Errorf("could not get metadata service", err)
 		return
@@ -74,7 +73,7 @@ func (e *subscribedServicesRevisionMetadataCustomizer) GetPriority() int {
 }
 
 func (e *subscribedServicesRevisionMetadataCustomizer) Customize(instance registry.ServiceInstance) {
-	ms, err := remote.NewMetadataService()
+	ms, err := getMetadataService()
 	if err != nil {
 		logger.Errorf("could not get metadata service", err)
 		return
diff --git a/registry/servicediscovery/service_discovery_registry.go b/registry/servicediscovery/service_discovery_registry.go
index 379578ddc67bbc8b30cdbbd2a7c423a2bb095648..39b2b1c28b999168e51b667607b29db27141e691 100644
--- a/registry/servicediscovery/service_discovery_registry.go
+++ b/registry/servicediscovery/service_discovery_registry.go
@@ -37,9 +37,10 @@ import (
 	"github.com/apache/dubbo-go/config"
 	"github.com/apache/dubbo-go/metadata/mapping"
 	"github.com/apache/dubbo-go/metadata/service"
+	"github.com/apache/dubbo-go/metadata/service/exporter/configurable"
 	"github.com/apache/dubbo-go/metadata/service/remote"
 	"github.com/apache/dubbo-go/registry"
-	registryCommon "github.com/apache/dubbo-go/registry/event"
+	"github.com/apache/dubbo-go/registry/event"
 	"github.com/apache/dubbo-go/registry/servicediscovery/proxy"
 	"github.com/apache/dubbo-go/registry/servicediscovery/synthesizer"
 	"github.com/apache/dubbo-go/remoting"
@@ -72,6 +73,15 @@ type serviceDiscoveryRegistry struct {
 }
 
 func newServiceDiscoveryRegistry(url *common.URL) (registry.Registry, error) {
+
+	// the metadata service is exported in DubboBootstrap of Java Dubbo
+	// but I don't want to introduce similar structure because we has less logic to do
+	// so I codes the related logic here.
+	// If necessary we need to think about moving there codes to somewhere else.
+
+	// init and expose metadata service
+	initMetadataService()
+
 	serviceDiscovery, err := creatServiceDiscovery(url)
 	if err != nil {
 		return nil, err
@@ -119,7 +129,7 @@ func creatServiceDiscovery(url *common.URL) (registry.ServiceDiscovery, error) {
 	if err != nil {
 		return nil, perrors.WithMessage(err, "Create service discovery fialed")
 	}
-	return registryCommon.NewEventPublishingServiceDiscovery(originServiceDiscovery), nil
+	return event.NewEventPublishingServiceDiscovery(originServiceDiscovery), nil
 }
 
 func parseServices(literalServices string) *gxset.HashSet {
@@ -176,7 +186,14 @@ func (s *serviceDiscoveryRegistry) Register(url common.URL) error {
 	if err != nil {
 		return perrors.WithMessage(err, "could not create servcie instance, please check your service url")
 	}
-	return s.serviceDiscovery.Register(ins)
+	err = s.serviceDiscovery.Register(ins)
+	if err != nil {
+		return perrors.WithMessage(err, "register the service failed")
+	}
+	return s.serviceNameMapping.Map(url.GetParam(constant.INTERFACE_KEY, ""),
+		url.GetParam(constant.GROUP_KEY, ""),
+		url.GetParam(constant.Version, ""),
+		url.Protocol)
 }
 
 func createInstance(url common.URL) (registry.ServiceInstance, error) {
@@ -642,5 +659,17 @@ func (icn *InstanceChangeNotify) Notify(event observer.Event) {
 		sdr := icn.serviceDiscoveryRegistry
 		sdr.subscribe(sdr.url, icn.notify, se.ServiceName, se.Instances)
 	}
+}
 
+func initMetadataService() {
+	ms, err := extension.GetMetadataService(config.GetApplicationConfig().MetadataType)
+	if err != nil {
+		logger.Errorf("could not init metadata service", err)
+	}
+	expt := configurable.NewMetadataServiceExporter(ms)
+	err = expt.Export()
+	if err != nil {
+		logger.Errorf("could not export the metadata service", err)
+	}
+	extension.GetGlobalDispatcher().Dispatch(event.NewServiceConfigExportedEvent(expt.(*configurable.MetadataServiceExporter).ServiceConfig))
 }
diff --git a/registry/servicediscovery/service_discovery_registry_test.go b/registry/servicediscovery/service_discovery_registry_test.go
index 4aa52f55cab068919209028f1b504ce0c4ae22e2..247cfd65eb0de5e85a4c046dbda844b2606bc3ac 100644
--- a/registry/servicediscovery/service_discovery_registry_test.go
+++ b/registry/servicediscovery/service_discovery_registry_test.go
@@ -28,10 +28,10 @@ var (
 )
 
 func TestServiceDiscoveryRegistry_Register(t *testing.T) {
-	//registryURL,_:=event.NewURL("in-memory://localhost:12345",
+	// registryURL,_:=event.NewURL("in-memory://localhost:12345",
 	//	event.WithParamsValue("registry-type","service"),
 	//	event.WithParamsValue("subscribed-services","a, b , c,d,e ,"))
-	//url,_:=event.NewURL("dubbo://192.168.0.102:20880/"+ SERVICE_INTERFACE +
+	// url,_:=event.NewURL("dubbo://192.168.0.102:20880/"+ SERVICE_INTERFACE +
 	//	"?&application=" + GROUP +
 	//	"&interface=" + SERVICE_INTERFACE +
 	//	"&group=" + GROUP +