key generate
diff --git a/pkg/dubbo/metadata/server.go b/pkg/dubbo/metadata/server.go
index 762a56d..81e6f48 100644
--- a/pkg/dubbo/metadata/server.go
+++ b/pkg/dubbo/metadata/server.go
@@ -102,7 +102,7 @@
 	}
 
 	// MetaData name = podName.revision
-	name := podName + "." + metadata.Revision
+	name := podName + "-" + metadata.Revision
 	registerReq := &RegisterRequest{ConfigsUpdated: map[core_model.ResourceKey]*mesh_proto.MetaData{}}
 	key := core_model.ResourceKey{
 		Mesh: mesh,
diff --git a/pkg/test/component.go b/pkg/test/component.go
index 466c6f5..7da4f94 100644
--- a/pkg/test/component.go
+++ b/pkg/test/component.go
@@ -24,10 +24,14 @@
 	core_model "github.com/apache/dubbo-kubernetes/pkg/core/resources/model"
 	"github.com/apache/dubbo-kubernetes/pkg/core/resources/store"
 	core_runtime "github.com/apache/dubbo-kubernetes/pkg/core/runtime"
-	"strings"
+	"github.com/apache/dubbo-kubernetes/pkg/util/rmkey"
 	"time"
 )
 
+const (
+	SystemNamespace = "dubbo-system"
+)
+
 var testServerLog = core.Log.WithName("test")
 
 func Setup(rt core_runtime.Runtime) error {
@@ -84,7 +88,7 @@
 		// get
 		if err := manager.Get(rt.AppContext(), dataplaneResource,
 			store.GetBy(core_model.ResourceKey{
-				Name: dataplaneList.Items[0].Meta.GetName(),
+				Name: dataplaneList.Items[0].Meta.GetName(), // 这个GetName已经是name.namespace的格式了
 				Mesh: "default",
 			})); err != nil {
 			return err
@@ -112,7 +116,7 @@
 		return err
 	}
 	if err := manager.Create(rt.AppContext(), metadata2, store.CreateBy(core_model.ResourceKey{
-		Name: metadata2.Spec.App + "-" + metadata2.Spec.Revision,
+		Name: rmkey.GenerateMetadataResourceKey(metadata2.Spec.App, metadata2.Spec.Revision, SystemNamespace),
 		Mesh: "default",
 	})); err != nil {
 		return err
@@ -121,7 +125,7 @@
 	metadata1 := mesh.NewMetaDataResource()
 	// get
 	if err := manager.Get(rt.AppContext(), metadata1, store.GetBy(core_model.ResourceKey{
-		Name: metadata2.Spec.App + "-" + metadata2.Spec.Revision,
+		Name: rmkey.GenerateMetadataResourceKey(metadata2.Spec.App, metadata2.Spec.Revision, SystemNamespace),
 		Mesh: "default",
 	})); err != nil {
 		return err
@@ -173,7 +177,7 @@
 
 	// create
 	if err := manager.Create(rt.AppContext(), mapping2, store.CreateBy(core_model.ResourceKey{
-		Name: strings.ToLower(strings.ReplaceAll(mapping2.Spec.InterfaceName, ".", "-")),
+		Name: rmkey.GenerateMappingResourceKey(mapping2.Spec.InterfaceName, SystemNamespace),
 		Mesh: "default",
 	})); err != nil {
 		return err
@@ -183,7 +187,7 @@
 	mapping1 := mesh.NewMappingResource()
 	// get
 	if err := manager.Get(rt.AppContext(), mapping1, store.GetBy(core_model.ResourceKey{
-		Name: strings.ToLower(strings.ReplaceAll("org.apache.dubbo.springboot.demo.DemoService1", ".", "-")),
+		Name: rmkey.GenerateMappingResourceKey("org.apache.dubbo.springboot.demo.DemoService1", SystemNamespace),
 		Mesh: "default",
 	})); err != nil {
 		return err
diff --git a/pkg/util/rmkey/resource_name.go b/pkg/util/rmkey/resource_name.go
new file mode 100644
index 0000000..097e2e5
--- /dev/null
+++ b/pkg/util/rmkey/resource_name.go
@@ -0,0 +1,55 @@
+/*
+ * 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 rmkey
+
+import (
+	util_k8s "github.com/apache/dubbo-kubernetes/pkg/util/k8s"
+	"strings"
+)
+
+const (
+	firstDelimiter  = "-"
+	secondDelimiter = "."
+	separator       = "/"
+)
+
+func GenerateMetadataResourceKey(app string, revision string, namespace string) string {
+	res := app
+	if revision != "" {
+		res += firstDelimiter + revision
+	}
+	if namespace != "" {
+		res += secondDelimiter + revision
+	}
+	return res
+}
+
+func GenerateNamespacedName(name string, namespace string) string {
+	if namespace == "" { // it's cluster scoped object
+		return name
+	}
+	return util_k8s.K8sNamespacedNameToCoreName(name, namespace)
+}
+
+func GenerateMappingResourceKey(interfaceName string, namespace string) string {
+	res := strings.ToLower(strings.ReplaceAll(interfaceName, ".", "-"))
+	if namespace == "" {
+		return res
+	}
+	return util_k8s.K8sNamespacedNameToCoreName(res, namespace)
+}