diff --git a/config/config_loader_test.go b/config/config_loader_test.go
index 461e607c1e0ad2e9471770224c8eb6d5f3ee96f6..baf0c8fba3c40d92c9de0d00181237afe2388ea7 100644
--- a/config/config_loader_test.go
+++ b/config/config_loader_test.go
@@ -503,6 +503,10 @@ func (m *mockServiceDiscovery) String() string {
 	panic("implement me")
 }
 
+func (m *mockServiceDiscovery) Init(registryURL common.URL) error {
+	panic("implement me")
+}
+
 func (m *mockServiceDiscovery) Destroy() error {
 	panic("implement me")
 }
diff --git a/registry/consul/service_discovery.go b/registry/consul/service_discovery.go
index b57f7719111e428804a5e56b38c3ec6246668a6e..e794beb0a9fafb8a9ecaf368686b60b146f6e215 100644
--- a/registry/consul/service_discovery.go
+++ b/registry/consul/service_discovery.go
@@ -227,31 +227,31 @@ func (csd *consulServiceDiscovery) GetServices() *gxset.HashSet {
 
 // encodeConsulMetadata because consul validate key strictly.
 func encodeConsulMetadata(metadata map[string]string) map[string]string {
+	consulMetadata := make(map[string]string, 8)
 	if metadata == nil {
-		metadata = make(map[string]string, 1)
+		return consulMetadata
 	}
 	encoder := base64.RawStdEncoding
 	for k, v := range metadata {
-		delete(metadata, k)
-		metadata[encoder.EncodeToString([]byte(k))] = v
+		consulMetadata[encoder.EncodeToString([]byte(k))] = v
 	}
-	return metadata
+	return consulMetadata
 }
 
 // nolint
 func decodeConsulMetadata(metadata map[string]string) map[string]string {
+	dubboMetadata := make(map[string]string, 8)
 	if metadata == nil {
-		metadata = make(map[string]string, 1)
+		return dubboMetadata
 	}
 	encoder := base64.RawStdEncoding
 	for k, v := range metadata {
-		delete(metadata, k)
 		kBytes, err := encoder.DecodeString(k)
 		if err != nil {
 			logger.Warnf("can not decoded consul metadata key %s", k)
 			continue
 		}
-		metadata[string(kBytes)] = v
+		dubboMetadata[string(kBytes)] = v
 	}
 	return metadata
 }