You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ti...@apache.org on 2020/10/18 07:33:56 UTC

[servicecomb-service-center] branch master updated: [SCB 2094] implement ms module interface (#710) (#718)

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

tianxiaoliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-service-center.git


The following commit(s) were added to refs/heads/master by this push:
     new 4251967  [SCB 2094] implement ms module interface (#710) (#718)
4251967 is described below

commit 425196780132d0505da7f343b3b969a856fc8443
Author: popozy <18...@163.com>
AuthorDate: Sun Oct 18 15:31:24 2020 +0800

    [SCB 2094] implement ms module interface (#710) (#718)
    
    1. implement service/ms/etcd interface
        + GetSchema
        + GetAllSchema
        + DeleteSchema
        + AddRule
        + GetRule
        + DeleteRule
        + UpdateRule
    
    2. finish unit test relative to the instance above
    
    3. add datasource to unit shell script
---
 datasource/etcd/dep_test.go        | 268 ++++++------
 datasource/etcd/etcd_suite_test.go |   6 +
 datasource/etcd/ms.go              | 697 ++++++++++++++++++++++++++-----
 datasource/etcd/ms_test.go         | 825 ++++++++++++++++++++++++++++++++++++-
 datasource/ms.go                   |  13 +-
 scripts/ut_test_in_docker.sh       |   1 +
 6 files changed, 1559 insertions(+), 251 deletions(-)

diff --git a/datasource/etcd/dep_test.go b/datasource/etcd/dep_test.go
index c7659ee..f2d07e6 100644
--- a/datasource/etcd/dep_test.go
+++ b/datasource/etcd/dep_test.go
@@ -49,10 +49,10 @@ func Test_Creat(t *testing.T) {
 		consumerId3 string
 	)
 	t.Run("should be passed", func(t *testing.T) {
-		resp, err := datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+		resp, err := datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
-				AppId:       "create_dep_group",
-				ServiceName: "create_dep_consumer",
+				AppId:       "dep_create_dep_group",
+				ServiceName: "dep_create_dep_consumer",
 				Version:     "1.0.0",
 				Level:       "FRONT",
 				Status:      pb.MS_UP,
@@ -63,10 +63,10 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 		consumerId1 = resp.ServiceId
 
-		resp, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+		resp, err = datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
-				AppId:       "create_dep_group",
-				ServiceName: "create_dep_consumer_all",
+				AppId:       "dep_create_dep_group",
+				ServiceName: "dep_create_dep_consumer_all",
 				Version:     "1.0.0",
 				Level:       "FRONT",
 				Status:      pb.MS_UP,
@@ -77,11 +77,11 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 		consumerId3 = resp.ServiceId
 
-		resp, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+		resp, err = datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
 				Environment: pb.ENV_PROD,
-				AppId:       "create_dep_group",
-				ServiceName: "create_dep_consumer",
+				AppId:       "dep_create_dep_group",
+				ServiceName: "dep_create_dep_consumer",
 				Version:     "1.0.0",
 				Level:       "FRONT",
 				Status:      pb.MS_UP,
@@ -92,10 +92,10 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 		consumerId2 = resp.ServiceId
 
-		resp, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+		resp, err = datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
-				AppId:       "create_dep_group",
-				ServiceName: "create_dep_provider",
+				AppId:       "dep_create_dep_group",
+				ServiceName: "dep_create_dep_provider",
 				Version:     "1.0.0",
 				Level:       "FRONT",
 				Status:      pb.MS_UP,
@@ -105,10 +105,10 @@ func Test_Creat(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 
-		resp, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+		resp, err = datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
-				AppId:       "create_dep_group",
-				ServiceName: "create_dep_provider",
+				AppId:       "dep_create_dep_group",
+				ServiceName: "dep_create_dep_provider",
 				Version:     "1.0.1",
 				Level:       "FRONT",
 				Status:      pb.MS_UP,
@@ -118,11 +118,11 @@ func Test_Creat(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 
-		resp, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+		resp, err = datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
 				Environment: pb.ENV_PROD,
-				AppId:       "create_dep_group",
-				ServiceName: "create_dep_provider",
+				AppId:       "dep_create_dep_group",
+				ServiceName: "dep_create_dep_provider",
 				Version:     "1.0.0",
 				Level:       "FRONT",
 				Status:      pb.MS_UP,
@@ -135,20 +135,20 @@ func Test_Creat(t *testing.T) {
 
 	t.Run("when request is invalid, should be failed", func(t *testing.T) {
 		consumer := &pb.MicroServiceKey{
-			AppId:       "create_dep_group",
-			ServiceName: "create_dep_consumer",
+			AppId:       "dep_create_dep_group",
+			ServiceName: "dep_create_dep_consumer",
 			Version:     "1.0.0",
 		}
 		providers := []*pb.MicroServiceKey{
 			{
-				AppId:       "create_dep_group",
-				ServiceName: "create_dep_provider",
+				AppId:       "dep_create_dep_group",
+				ServiceName: "dep_create_dep_provider",
 				Version:     "1.0.0",
 			},
 		}
 
 		// consumer does not exist
-		resp, err := datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err := datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: &pb.MicroServiceKey{
@@ -165,14 +165,14 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, scerr.ErrServiceNotExists, resp.Response.GetCode())
 
 		// provider version is invalid
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
 					Providers: []*pb.MicroServiceKey{
 						{
-							AppId:       "create_dep_group",
-							ServiceName: "create_dep_provider",
+							AppId:       "dep_create_dep_group",
+							ServiceName: "dep_create_dep_provider",
 							Version:     "1.0.32768",
 						},
 					},
@@ -184,12 +184,12 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
 
 		// consumer version is invalid
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: &pb.MicroServiceKey{
-						AppId:       "create_dep_group",
-						ServiceName: "create_dep_consumer",
+						AppId:       "dep_create_dep_group",
+						ServiceName: "dep_create_dep_consumer",
 						Version:     "1.0.0+",
 					},
 					Providers: providers,
@@ -200,12 +200,12 @@ func Test_Creat(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
 
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: &pb.MicroServiceKey{
-						AppId:       "create_dep_group",
-						ServiceName: "create_dep_consumer",
+						AppId:       "dep_create_dep_group",
+						ServiceName: "dep_create_dep_consumer",
 						Version:     "1.0.0-1.0.1",
 					},
 					Providers: providers,
@@ -216,12 +216,12 @@ func Test_Creat(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
 
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: &pb.MicroServiceKey{
-						AppId:       "create_dep_group",
-						ServiceName: "create_dep_consumer",
+						AppId:       "dep_create_dep_group",
+						ServiceName: "dep_create_dep_consumer",
 						Version:     "latest",
 					},
 					Providers: providers,
@@ -232,12 +232,12 @@ func Test_Creat(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
 
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: &pb.MicroServiceKey{
-						AppId:       "create_dep_group",
-						ServiceName: "create_dep_consumer",
+						AppId:       "dep_create_dep_group",
+						ServiceName: "dep_create_dep_consumer",
 						Version:     "",
 					},
 					Providers: providers,
@@ -248,11 +248,11 @@ func Test_Creat(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
 
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: &pb.MicroServiceKey{
-						AppId:       "create_dep_group",
+						AppId:       "dep_create_dep_group",
 						ServiceName: "*",
 						Version:     "1.0.0",
 					},
@@ -265,14 +265,14 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
 
 		// provider app is invalid
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
 					Providers: []*pb.MicroServiceKey{
 						{
 							AppId:       "*",
-							ServiceName: "service_name_provider",
+							ServiceName: "dep_service_name_provider",
 							Version:     "2.0.0",
 						},
 					},
@@ -284,13 +284,13 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
 
 		// provider serviceName is invalid
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
 					Providers: []*pb.MicroServiceKey{
 						{
-							AppId:       "service_group_provider",
+							AppId:       "dep_service_group_provider",
 							ServiceName: "-",
 							Version:     "2.0.0",
 						},
@@ -303,14 +303,14 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
 
 		// provider version is invalid
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
 					Providers: []*pb.MicroServiceKey{
 						{
-							AppId:       "service_group_provider",
-							ServiceName: "service_name_provider",
+							AppId:       "dep_service_group_provider",
+							ServiceName: "dep_service_name_provider",
 							Version:     "",
 						},
 					},
@@ -322,15 +322,15 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
 
 		// provider in diff env
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
 					Providers: []*pb.MicroServiceKey{
 						{
 							Environment: pb.ENV_PROD,
-							AppId:       "service_group_provider",
-							ServiceName: "service_name_provider",
+							AppId:       "dep_service_group_provider",
+							ServiceName: "dep_service_name_provider",
 							Version:     "latest",
 						},
 					},
@@ -343,14 +343,14 @@ func Test_Creat(t *testing.T) {
 
 		// consumer in diff env
 		consumer.Environment = pb.ENV_PROD
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
 					Providers: []*pb.MicroServiceKey{
 						{
-							AppId:       "service_group_provider",
-							ServiceName: "service_name_provider",
+							AppId:       "dep_service_group_provider",
+							ServiceName: "dep_service_name_provider",
 							Version:     "latest",
 						},
 					},
@@ -363,7 +363,7 @@ func Test_Creat(t *testing.T) {
 
 		assert.Equal(t, nil, deh.Handle())
 
-		respCon, err := datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respCon, err := datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: consumerId1,
 		})
 		assert.NotNil(t, respCon)
@@ -371,7 +371,7 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, respCon.Response.GetCode())
 		assert.Equal(t, 0, len(respCon.Providers))
 
-		respCon, err = datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respCon, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: consumerId2,
 		})
 		assert.NotNil(t, respCon)
@@ -384,20 +384,20 @@ func Test_Creat(t *testing.T) {
 		for i := 0; i < 101; i++ {
 			deps = append(deps, &pb.ConsumerDependency{
 				Consumer: &pb.MicroServiceKey{
-					AppId:       "create_dep_group",
-					ServiceName: "create_dep_consumer" + strconv.Itoa(i),
+					AppId:       "dep_create_dep_group",
+					ServiceName: "dep_create_dep_consumer" + strconv.Itoa(i),
 					Version:     "1.0.0",
 				},
 				Providers: []*pb.MicroServiceKey{
 					{
-						AppId:       "service_group_provider",
-						ServiceName: "service_name_provider",
+						AppId:       "dep_service_group_provider",
+						ServiceName: "dep_service_name_provider",
 						Version:     "latest",
 					},
 				},
 			})
 		}
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: deps,
 		})
 		assert.NotNil(t, resp)
@@ -407,20 +407,20 @@ func Test_Creat(t *testing.T) {
 
 	t.Run("when request is valid, should be passed", func(t *testing.T) {
 		consumer := &pb.MicroServiceKey{
-			ServiceName: "create_dep_consumer",
-			AppId:       "create_dep_group",
+			ServiceName: "dep_create_dep_consumer",
+			AppId:       "dep_create_dep_group",
 			Version:     "1.0.0",
 		}
 
 		// add latest
-		resp, err := datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err := datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
 					Providers: []*pb.MicroServiceKey{
 						{
-							AppId:       "create_dep_group",
-							ServiceName: "create_dep_provider",
+							AppId:       "dep_create_dep_group",
+							ServiceName: "dep_create_dep_provider",
 							Version:     "latest",
 						},
 					},
@@ -433,7 +433,7 @@ func Test_Creat(t *testing.T) {
 
 		assert.Equal(t, nil, deh.Handle())
 
-		respPro, err := datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respPro, err := datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: consumerId1,
 		})
 		assert.NotNil(t, respPro)
@@ -441,14 +441,14 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, respPro.Response.GetCode())
 
 		// add 1.0.0+
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
 					Providers: []*pb.MicroServiceKey{
 						{
-							AppId:       "create_dep_group",
-							ServiceName: "create_dep_provider",
+							AppId:       "dep_create_dep_group",
+							ServiceName: "dep_create_dep_provider",
 							Version:     "1.0.0+",
 						},
 					},
@@ -459,7 +459,7 @@ func Test_Creat(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 
-		respPro, err = datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respPro, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: consumerId1,
 		})
 		assert.NotNil(t, respPro)
@@ -467,12 +467,12 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, respPro.Response.GetCode())
 
 		// add *
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: &pb.MicroServiceKey{
-						ServiceName: "create_dep_consumer_all",
-						AppId:       "create_dep_group",
+						ServiceName: "dep_create_dep_consumer_all",
+						AppId:       "dep_create_dep_group",
 						Version:     "1.0.0",
 					},
 					Providers: []*pb.MicroServiceKey{
@@ -487,7 +487,7 @@ func Test_Creat(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 
-		respPro, err = datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respPro, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: consumerId3,
 		})
 		assert.NotNil(t, respPro)
@@ -496,12 +496,12 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, 0, len(respPro.Providers))
 
 		// clean all
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: &pb.MicroServiceKey{
-						ServiceName: "create_dep_consumer_all",
-						AppId:       "create_dep_group",
+						ServiceName: "dep_create_dep_consumer_all",
+						AppId:       "dep_create_dep_group",
 						Version:     "1.0.0",
 					},
 					Providers: nil,
@@ -513,14 +513,14 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 
 		// add multiple providers
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
 					Providers: []*pb.MicroServiceKey{
 						{
-							AppId:       "create_dep_group",
-							ServiceName: "create_dep_provider",
+							AppId:       "dep_create_dep_group",
+							ServiceName: "dep_create_dep_provider",
 							Version:     "1.0.0",
 						},
 						{
@@ -535,14 +535,14 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 
 		// add 1.0.0-2.0.0 to override *
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
 					Providers: []*pb.MicroServiceKey{
 						{
-							AppId:       "create_dep_group",
-							ServiceName: "create_dep_provider",
+							AppId:       "dep_create_dep_group",
+							ServiceName: "dep_create_dep_provider",
 							Version:     "1.0.0-1.0.1",
 						},
 					},
@@ -555,7 +555,7 @@ func Test_Creat(t *testing.T) {
 
 		assert.Equal(t, nil, deh.Handle())
 
-		respPro, err = datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respPro, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: consumerId1,
 		})
 		assert.NotNil(t, respPro)
@@ -564,14 +564,14 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, "1.0.0", respPro.Providers[0].Version)
 
 		// add not override
-		respAdd, err := datasource.Instance().AddDependency(getContext(), &pb.AddDependenciesRequest{
+		respAdd, err := datasource.Instance().AddDependency(depGetContext(), &pb.AddDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
 					Providers: []*pb.MicroServiceKey{
 						{
-							AppId:       "create_dep_group",
-							ServiceName: "create_dep_provider",
+							AppId:       "dep_create_dep_group",
+							ServiceName: "dep_create_dep_provider",
 							Version:     "1.0.0-3.0.0",
 						},
 					},
@@ -584,7 +584,7 @@ func Test_Creat(t *testing.T) {
 
 		assert.Equal(t, nil, deh.Handle())
 
-		respPro, err = datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respPro, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: consumerId1,
 		})
 		assert.NotNil(t, respPro)
@@ -592,7 +592,7 @@ func Test_Creat(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, respPro.Response.GetCode())
 
 		// add provider is empty
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer:  consumer,
@@ -604,7 +604,7 @@ func Test_Creat(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 
-		resp, err = datasource.Instance().CreateDependency(getContext(), &pb.CreateDependenciesRequest{
+		resp, err = datasource.Instance().CreateDependency(depGetContext(), &pb.CreateDependenciesRequest{
 			Dependencies: []*pb.ConsumerDependency{
 				{
 					Consumer: consumer,
@@ -617,7 +617,7 @@ func Test_Creat(t *testing.T) {
 
 		assert.Equal(t, nil, deh.Handle())
 
-		respPro, err = datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respPro, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: consumerId1,
 		})
 		assert.NotNil(t, respPro)
@@ -646,10 +646,10 @@ func Test_Get(t *testing.T) {
 	)
 
 	t.Run("should be passed", func(t *testing.T) {
-		resp, err := datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+		resp, err := datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
-				AppId:       "get_dep_group",
-				ServiceName: "get_dep_consumer",
+				AppId:       "dep_get_dep_group",
+				ServiceName: "dep_get_dep_consumer",
 				Version:     "1.0.0",
 				Level:       "FRONT",
 				Status:      pb.MS_UP,
@@ -660,10 +660,10 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 		consumerId1 = resp.ServiceId
 
-		resp, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+		resp, err = datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
-				AppId:       "get_dep_group",
-				ServiceName: "get_dep_provider",
+				AppId:       "dep_get_dep_group",
+				ServiceName: "dep_get_dep_provider",
 				Version:     "1.0.0",
 				Level:       "FRONT",
 				Status:      pb.MS_UP,
@@ -674,10 +674,10 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 		providerId1 = resp.ServiceId
 
-		resp, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+		resp, err = datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
-				AppId:       "get_dep_group",
-				ServiceName: "get_dep_provider",
+				AppId:       "dep_get_dep_group",
+				ServiceName: "dep_get_dep_provider",
 				Version:     "2.0.0",
 				Level:       "FRONT",
 				Status:      pb.MS_UP,
@@ -691,7 +691,7 @@ func Test_Get(t *testing.T) {
 
 	t.Run("when request is invalid, should be failed", func(t *testing.T) {
 		//service id is empty when get provider
-		resp, err := datasource.Instance().SearchProviderDependency(getContext(), &pb.GetDependenciesRequest{
+		resp, err := datasource.Instance().SearchProviderDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: "",
 		})
 		assert.NotNil(t, resp)
@@ -699,7 +699,7 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
 
 		//service does not exist when get provider
-		resp, err = datasource.Instance().SearchProviderDependency(getContext(), &pb.GetDependenciesRequest{
+		resp, err = datasource.Instance().SearchProviderDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: "noneservice",
 		})
 		assert.NotNil(t, resp)
@@ -707,7 +707,7 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, scerr.ErrServiceNotExists, resp.Response.GetCode())
 
 		//service id is empty when get consumer
-		resp, err = datasource.Instance().SearchProviderDependency(getContext(), &pb.GetDependenciesRequest{
+		resp, err = datasource.Instance().SearchProviderDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: "",
 		})
 		assert.NotNil(t, resp)
@@ -715,7 +715,7 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
 
 		//service does not exist when get consumer
-		resp, err = datasource.Instance().SearchProviderDependency(getContext(), &pb.GetDependenciesRequest{
+		resp, err = datasource.Instance().SearchProviderDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: "noneservice",
 		})
 		assert.NotNil(t, resp)
@@ -725,7 +725,7 @@ func Test_Get(t *testing.T) {
 
 	t.Run("when request is valid, should be passed", func(t *testing.T) {
 		//get provider
-		resp, err := datasource.Instance().SearchProviderDependency(getContext(), &pb.GetDependenciesRequest{
+		resp, err := datasource.Instance().SearchProviderDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: providerId1,
 		})
 		assert.NotNil(t, resp)
@@ -733,7 +733,7 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
 
 		//get consumer
-		resp, err = datasource.Instance().SearchProviderDependency(getContext(), &pb.GetDependenciesRequest{
+		resp, err = datasource.Instance().SearchProviderDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: consumerId1,
 		})
 		assert.NotNil(t, resp)
@@ -743,10 +743,10 @@ func Test_Get(t *testing.T) {
 
 	t.Run("when after finding instance, should created dependencies between C and P", func(t *testing.T) {
 		// find provider
-		resp, err := datasource.Instance().FindInstances(getContext(), &pb.FindInstancesRequest{
+		resp, err := datasource.Instance().FindInstances(depGetContext(), &pb.FindInstancesRequest{
 			ConsumerServiceId: consumerId1,
-			AppId:             "get_dep_group",
-			ServiceName:       "get_dep_provider",
+			AppId:             "dep_get_dep_group",
+			ServiceName:       "dep_get_dep_provider",
 			VersionRule:       "1.0.0+",
 		})
 		assert.NotNil(t, resp)
@@ -756,7 +756,7 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, nil, deh.Handle())
 
 		// get consumer's deps
-		respGetP, err := datasource.Instance().SearchProviderDependency(getContext(), &pb.GetDependenciesRequest{
+		respGetP, err := datasource.Instance().SearchProviderDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: providerId1,
 		})
 		assert.NotNil(t, respGetP)
@@ -764,7 +764,7 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, respGetP.Response.GetCode())
 
 		// get provider's deps
-		respGetC, err := datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respGetC, err := datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: consumerId1,
 		})
 		assert.NotNil(t, respGetC)
@@ -772,10 +772,10 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, respGetC.Response.GetCode())
 
 		// get self deps
-		resp, err = datasource.Instance().FindInstances(getContext(), &pb.FindInstancesRequest{
+		resp, err = datasource.Instance().FindInstances(depGetContext(), &pb.FindInstancesRequest{
 			ConsumerServiceId: consumerId1,
-			AppId:             "get_dep_group",
-			ServiceName:       "get_dep_consumer",
+			AppId:             "dep_get_dep_group",
+			ServiceName:       "dep_get_dep_consumer",
 			VersionRule:       "1.0.0+",
 		})
 		assert.NotNil(t, resp)
@@ -784,7 +784,7 @@ func Test_Get(t *testing.T) {
 
 		assert.Equal(t, nil, deh.Handle())
 
-		respGetC, err = datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respGetC, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: consumerId1,
 			NoSelf:    true,
 		})
@@ -793,20 +793,20 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, respGetC.Response.GetCode())
 
 		// find before provider register
-		resp, err = datasource.Instance().FindInstances(getContext(), &pb.FindInstancesRequest{
+		resp, err = datasource.Instance().FindInstances(depGetContext(), &pb.FindInstancesRequest{
 			ConsumerServiceId: providerId2,
-			AppId:             "get_dep_group",
-			ServiceName:       "get_dep_finder",
+			AppId:             "dep_get_dep_group",
+			ServiceName:       "dep_get_dep_finder",
 			VersionRule:       "1.0.0+",
 		})
 		assert.NotNil(t, resp)
 		assert.NoError(t, err)
 		assert.Equal(t, scerr.ErrServiceNotExists, resp.Response.GetCode())
 
-		respCreateF, err := datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+		respCreateF, err := datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
-				AppId:       "get_dep_group",
-				ServiceName: "get_dep_finder",
+				AppId:       "dep_get_dep_group",
+				ServiceName: "dep_get_dep_finder",
 				Version:     "1.0.0",
 				Level:       "FRONT",
 				Status:      pb.MS_UP,
@@ -817,10 +817,10 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, respCreateF.Response.GetCode())
 		finder1 := respCreateF.ServiceId
 
-		resp, err = datasource.Instance().FindInstances(getContext(), &pb.FindInstancesRequest{
+		resp, err = datasource.Instance().FindInstances(depGetContext(), &pb.FindInstancesRequest{
 			ConsumerServiceId: providerId2,
-			AppId:             "get_dep_group",
-			ServiceName:       "get_dep_finder",
+			AppId:             "dep_get_dep_group",
+			ServiceName:       "dep_get_dep_finder",
 			VersionRule:       "1.0.0+",
 		})
 		assert.NotNil(t, resp)
@@ -829,7 +829,7 @@ func Test_Get(t *testing.T) {
 
 		assert.Equal(t, nil, deh.Handle())
 
-		respGetC, err = datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respGetC, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: providerId2,
 		})
 		assert.NotNil(t, respGetC)
@@ -839,7 +839,7 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, finder1, respGetC.Providers[0].ServiceId)
 
 		// find after delete micro service
-		respDelP, err := datasource.Instance().UnregisterService(getContext(), &pb.DeleteServiceRequest{
+		respDelP, err := datasource.Instance().UnregisterService(depGetContext(), &pb.DeleteServiceRequest{
 			ServiceId: finder1, Force: true,
 		})
 		assert.NotNil(t, respDelP)
@@ -848,7 +848,7 @@ func Test_Get(t *testing.T) {
 
 		assert.Equal(t, nil, deh.Handle())
 
-		respGetC, err = datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respGetC, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: providerId2,
 		})
 		assert.NotNil(t, respGetC)
@@ -856,11 +856,11 @@ func Test_Get(t *testing.T) {
 		assert.Equal(t, proto.Response_SUCCESS, respGetC.Response.GetCode())
 		assert.Equal(t, 0, len(respGetC.Providers))
 
-		respCreateF, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+		respCreateF, err = datasource.Instance().RegisterService(depGetContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
 				ServiceId:   finder1,
-				AppId:       "get_dep_group",
-				ServiceName: "get_dep_finder",
+				AppId:       "dep_get_dep_group",
+				ServiceName: "dep_get_dep_finder",
 				Version:     "1.0.0",
 				Level:       "FRONT",
 				Status:      pb.MS_UP,
@@ -870,10 +870,10 @@ func Test_Get(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, proto.Response_SUCCESS, respCreateF.Response.GetCode())
 
-		resp, err = datasource.Instance().FindInstances(getContext(), &pb.FindInstancesRequest{
+		resp, err = datasource.Instance().FindInstances(depGetContext(), &pb.FindInstancesRequest{
 			ConsumerServiceId: providerId2,
-			AppId:             "get_dep_group",
-			ServiceName:       "get_dep_finder",
+			AppId:             "dep_get_dep_group",
+			ServiceName:       "dep_get_dep_finder",
 			VersionRule:       "1.0.0+",
 		})
 		assert.NotNil(t, resp)
@@ -882,7 +882,7 @@ func Test_Get(t *testing.T) {
 
 		assert.Equal(t, nil, deh.Handle())
 
-		respGetC, err = datasource.Instance().SearchConsumerDependency(getContext(), &pb.GetDependenciesRequest{
+		respGetC, err = datasource.Instance().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
 			ServiceId: providerId2,
 		})
 		assert.NotNil(t, respGetC)
diff --git a/datasource/etcd/etcd_suite_test.go b/datasource/etcd/etcd_suite_test.go
index 1560595..aa275a0 100644
--- a/datasource/etcd/etcd_suite_test.go
+++ b/datasource/etcd/etcd_suite_test.go
@@ -54,6 +54,12 @@ func getContext() context.Context {
 		util.CtxNocache, "1")
 }
 
+func depGetContext() context.Context {
+	return util.SetContext(
+		util.SetDomainProject(context.Background(), "new_default", "new_default"),
+		util.CtxNocache, "1")
+}
+
 func TestGrpc(t *testing.T) {
 	RegisterFailHandler(Fail)
 	junitReporter := reporters.NewJUnitReporter("model.junit.xml")
diff --git a/datasource/etcd/ms.go b/datasource/etcd/ms.go
index 8b2b41b..c84ef79 100644
--- a/datasource/etcd/ms.go
+++ b/datasource/etcd/ms.go
@@ -3,12 +3,12 @@
  * 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 not use this file except request 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
+ * Unless required by applicable law or agreed to request 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
@@ -30,6 +30,7 @@ import (
 	"github.com/apache/servicecomb-service-center/server/core/backend"
 	"github.com/apache/servicecomb-service-center/server/core/proto"
 	"github.com/apache/servicecomb-service-center/server/plugin"
+	"github.com/apache/servicecomb-service-center/server/plugin/discovery"
 	"github.com/apache/servicecomb-service-center/server/plugin/quota"
 	"github.com/apache/servicecomb-service-center/server/plugin/registry"
 	scerr "github.com/apache/servicecomb-service-center/server/scerror"
@@ -216,9 +217,9 @@ func (ds *DataSource) RegisterInstance(ctx context.Context, request *pb.Register
 	if len(instance.InstanceId) > 0 {
 		// keep alive the lease ttl
 		// there are two reasons for sending a heartbeat here:
-		// 1. in the scenario the instance has been removed,
+		// 1. request the scenario the instance has been removed,
 		//    the cast of registration operation can be reduced.
-		// 2. in the self-protection scenario, the instance is unhealthy
+		// 2. request the self-protection scenario, the instance is unhealthy
 		//    and needs to be re-registered.
 		resp, err := ds.Heartbeat(ctx, &pb.HeartbeatRequest{ServiceId: instance.ServiceId,
 			InstanceId: instance.InstanceId})
@@ -352,61 +353,61 @@ func (ds *DataSource) RegisterInstance(ctx context.Context, request *pb.Register
 	}, nil
 }
 
-func (ds *DataSource) GetInstance(ctx context.Context, in *pb.GetOneInstanceRequest) (
+func (ds *DataSource) GetInstance(ctx context.Context, request *pb.GetOneInstanceRequest) (
 	*pb.GetOneInstanceResponse, error) {
 	domainProject := util.ParseDomainProject(ctx)
 
 	service := &pb.MicroService{}
 	var err error
-	if len(in.ConsumerServiceId) > 0 {
-		service, err = serviceUtil.GetService(ctx, domainProject, in.ConsumerServiceId)
+	if len(request.ConsumerServiceId) > 0 {
+		service, err = serviceUtil.GetService(ctx, domainProject, request.ConsumerServiceId)
 		if err != nil {
 			log.Errorf(err, "get consumer failed, consumer[%s] find provider instance[%s/%s]",
-				in.ConsumerServiceId, in.ProviderServiceId, in.ProviderInstanceId)
+				request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId)
 			return &pb.GetOneInstanceResponse{
 				Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
 			}, err
 		}
 		if service == nil {
 			log.Errorf(nil, "consumer does not exist, consumer[%s] find provider instance[%s/%s]",
-				in.ConsumerServiceId, in.ProviderServiceId, in.ProviderInstanceId)
+				request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId)
 			return &pb.GetOneInstanceResponse{
 				Response: proto.CreateResponse(scerr.ErrServiceNotExists,
-					fmt.Sprintf("Consumer[%s] does not exist.", in.ConsumerServiceId)),
+					fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)),
 			}, nil
 		}
 	}
 
-	provider, err := serviceUtil.GetService(ctx, domainProject, in.ProviderServiceId)
+	provider, err := serviceUtil.GetService(ctx, domainProject, request.ProviderServiceId)
 	if err != nil {
 		log.Errorf(err, "get provider failed, consumer[%s] find provider instance[%s/%s]",
-			in.ConsumerServiceId, in.ProviderServiceId, in.ProviderInstanceId)
+			request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId)
 		return &pb.GetOneInstanceResponse{
 			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if provider == nil {
 		log.Errorf(nil, "provider does not exist, consumer[%s] find provider instance[%s/%s]",
-			in.ConsumerServiceId, in.ProviderServiceId, in.ProviderInstanceId)
+			request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId)
 		return &pb.GetOneInstanceResponse{
 			Response: proto.CreateResponse(scerr.ErrServiceNotExists,
-				fmt.Sprintf("Provider[%s] does not exist.", in.ProviderServiceId)),
+				fmt.Sprintf("Provider[%s] does not exist.", request.ProviderServiceId)),
 		}, nil
 	}
 
 	findFlag := func() string {
 		return fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find provider[%s][%s/%s/%s/%s] instance[%s]",
-			in.ConsumerServiceId, service.Environment, service.AppId, service.ServiceName, service.Version,
+			request.ConsumerServiceId, service.Environment, service.AppId, service.ServiceName, service.Version,
 			provider.ServiceId, provider.Environment, provider.AppId, provider.ServiceName, provider.Version,
-			in.ProviderInstanceId)
+			request.ProviderInstanceId)
 	}
 
 	var item *cache.VersionRuleCacheItem
 	rev, _ := ctx.Value(util.CtxRequestRevision).(string)
 	item, err = cache.FindInstances.GetWithProviderID(ctx, service, proto.MicroServiceToKey(domainProject, provider),
 		&pb.HeartbeatSetElement{
-			ServiceId: in.ProviderServiceId, InstanceId: in.ProviderInstanceId,
-		}, in.Tags, rev)
+			ServiceId: request.ProviderServiceId, InstanceId: request.ProviderInstanceId,
+		}, request.Tags, rev)
 	if err != nil {
 		log.Errorf(err, "FindInstances.GetWithProviderID failed, %s failed", findFlag())
 		return &pb.GetOneInstanceResponse{
@@ -433,20 +434,20 @@ func (ds *DataSource) GetInstance(ctx context.Context, in *pb.GetOneInstanceRequ
 	}, nil
 }
 
-func (ds *DataSource) FindInstances(ctx context.Context, in *pb.FindInstancesRequest) (*pb.FindInstancesResponse,
+func (ds *DataSource) FindInstances(ctx context.Context, request *pb.FindInstancesRequest) (*pb.FindInstancesResponse,
 	error) {
 	provider := &pb.MicroServiceKey{
 		Tenant:      util.ParseTargetDomainProject(ctx),
-		Environment: in.Environment,
-		AppId:       in.AppId,
-		ServiceName: in.ServiceName,
-		Alias:       in.ServiceName,
-		Version:     in.VersionRule,
+		Environment: request.Environment,
+		AppId:       request.AppId,
+		ServiceName: request.ServiceName,
+		Alias:       request.ServiceName,
+		Version:     request.VersionRule,
 	}
 
 	rev, ok := ctx.Value(util.CtxRequestRevision).(string)
 	if !ok {
-		err := errors.New("rev in context is not type string")
+		err := errors.New("rev request context is not type string")
 		log.Error("", err)
 		return &pb.FindInstancesResponse{
 			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
@@ -454,48 +455,48 @@ func (ds *DataSource) FindInstances(ctx context.Context, in *pb.FindInstancesReq
 	}
 
 	if apt.IsShared(provider) {
-		return ds.findSharedServiceInstance(ctx, in, provider, rev)
+		return ds.findSharedServiceInstance(ctx, request, provider, rev)
 	}
-	return ds.findInstance(ctx, in, provider, rev)
+	return ds.findInstance(ctx, request, provider, rev)
 }
 
-func (ds *DataSource) findInstance(ctx context.Context, in *pb.FindInstancesRequest,
+func (ds *DataSource) findInstance(ctx context.Context, request *pb.FindInstancesRequest,
 	provider *pb.MicroServiceKey, rev string) (*pb.FindInstancesResponse, error) {
 	var err error
 	domainProject := util.ParseDomainProject(ctx)
-	service := &pb.MicroService{Environment: in.Environment}
-	if len(in.ConsumerServiceId) > 0 {
-		service, err = serviceUtil.GetService(ctx, domainProject, in.ConsumerServiceId)
+	service := &pb.MicroService{Environment: request.Environment}
+	if len(request.ConsumerServiceId) > 0 {
+		service, err = serviceUtil.GetService(ctx, domainProject, request.ConsumerServiceId)
 		if err != nil {
 			log.Errorf(err, "get consumer failed, consumer[%s] find provider[%s/%s/%s/%s]",
-				in.ConsumerServiceId, in.Environment, in.AppId, in.ServiceName, in.VersionRule)
+				request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule)
 			return &pb.FindInstancesResponse{
 				Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
 			}, err
 		}
 		if service == nil {
 			log.Errorf(nil, "consumer does not exist, consumer[%s] find provider[%s/%s/%s/%s]",
-				in.ConsumerServiceId, in.Environment, in.AppId, in.ServiceName, in.VersionRule)
+				request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule)
 			return &pb.FindInstancesResponse{
 				Response: proto.CreateResponse(scerr.ErrServiceNotExists,
-					fmt.Sprintf("Consumer[%s] does not exist.", in.ConsumerServiceId)),
+					fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)),
 			}, nil
 		}
 		provider.Environment = service.Environment
 	}
 
 	// provider is not a shared micro-service,
-	// only allow shared micro-service instances found in different domains.
+	// only allow shared micro-service instances found request different domains.
 	ctx = util.SetTargetDomainProject(ctx, util.ParseDomain(ctx), util.ParseProject(ctx))
 	provider.Tenant = util.ParseTargetDomainProject(ctx)
 
 	findFlag := fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find provider[%s/%s/%s/%s]",
-		in.ConsumerServiceId, service.Environment, service.AppId, service.ServiceName, service.Version,
+		request.ConsumerServiceId, service.Environment, service.AppId, service.ServiceName, service.Version,
 		provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
 
 	// cache
 	var item *cache.VersionRuleCacheItem
-	item, err = cache.FindInstances.Get(ctx, service, provider, in.Tags, rev)
+	item, err = cache.FindInstances.Get(ctx, service, provider, request.Tags, rev)
 	if err != nil {
 		log.Errorf(err, "FindInstancesCache.Get failed, %s failed", findFlag)
 		return &pb.FindInstancesResponse{
@@ -511,9 +512,9 @@ func (ds *DataSource) findInstance(ctx context.Context, in *pb.FindInstancesRequ
 	}
 
 	// add dependency queue
-	if len(in.ConsumerServiceId) > 0 &&
+	if len(request.ConsumerServiceId) > 0 &&
 		len(item.ServiceIds) > 0 &&
-		!cache.DependencyRule.ExistVersionRule(ctx, in.ConsumerServiceId, provider) {
+		!cache.DependencyRule.ExistVersionRule(ctx, request.ConsumerServiceId, provider) {
 		provider, err = ds.reshapeProviderKey(ctx, provider, item.ServiceIds[0])
 		if err != nil {
 			return nil, err
@@ -538,17 +539,17 @@ func (ds *DataSource) findInstance(ctx context.Context, in *pb.FindInstancesRequ
 	return ds.genFindResult(ctx, rev, item)
 }
 
-func (ds *DataSource) findSharedServiceInstance(ctx context.Context, in *pb.FindInstancesRequest,
+func (ds *DataSource) findSharedServiceInstance(ctx context.Context, request *pb.FindInstancesRequest,
 	provider *pb.MicroServiceKey, rev string) (*pb.FindInstancesResponse, error) {
 	var err error
-	service := &pb.MicroService{Environment: in.Environment}
+	service := &pb.MicroService{Environment: request.Environment}
 	// it means the shared micro-services must be the same env with SC.
 	provider.Environment = apt.Service.Environment
 	findFlag := fmt.Sprintf("find shared provider[%s/%s/%s/%s]", provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
 
 	// cache
 	var item *cache.VersionRuleCacheItem
-	item, err = cache.FindInstances.Get(ctx, service, provider, in.Tags, rev)
+	item, err = cache.FindInstances.Get(ctx, service, provider, request.Tags, rev)
 	if err != nil {
 		log.Errorf(err, "FindInstancesCache.Get failed, %s failed", findFlag)
 		return &pb.FindInstancesResponse{
@@ -594,12 +595,12 @@ func (ds *DataSource) reshapeProviderKey(ctx context.Context, provider *pb.Micro
 	return provider, nil
 }
 
-func (ds *DataSource) UpdateInstanceStatus(ctx context.Context, in *pb.UpdateInstanceStatusRequest) (*pb.
+func (ds *DataSource) UpdateInstanceStatus(ctx context.Context, request *pb.UpdateInstanceStatusRequest) (*pb.
 	UpdateInstanceStatusResponse, error) {
 	domainProject := util.ParseDomainProject(ctx)
-	updateStatusFlag := util.StringJoin([]string{in.ServiceId, in.InstanceId, in.Status}, "/")
+	updateStatusFlag := util.StringJoin([]string{request.ServiceId, request.InstanceId, request.Status}, "/")
 
-	instance, err := serviceUtil.GetInstance(ctx, domainProject, in.ServiceId, in.InstanceId)
+	instance, err := serviceUtil.GetInstance(ctx, domainProject, request.ServiceId, request.InstanceId)
 	if err != nil {
 		log.Errorf(err, "update instance[%s] status failed", updateStatusFlag)
 		return &pb.UpdateInstanceStatusResponse{
@@ -614,7 +615,7 @@ func (ds *DataSource) UpdateInstanceStatus(ctx context.Context, in *pb.UpdateIns
 	}
 
 	copyInstanceRef := *instance
-	copyInstanceRef.Status = in.Status
+	copyInstanceRef.Status = request.Status
 
 	if err := serviceUtil.UpdateInstance(ctx, domainProject, &copyInstanceRef); err != nil {
 		log.Errorf(err, "update instance[%s] status failed", updateStatusFlag)
@@ -633,12 +634,12 @@ func (ds *DataSource) UpdateInstanceStatus(ctx context.Context, in *pb.UpdateIns
 	}, nil
 }
 
-func (ds *DataSource) UpdateInstanceProperties(ctx context.Context, in *pb.UpdateInstancePropsRequest) (
+func (ds *DataSource) UpdateInstanceProperties(ctx context.Context, request *pb.UpdateInstancePropsRequest) (
 	*pb.UpdateInstancePropsResponse, error) {
 	domainProject := util.ParseDomainProject(ctx)
-	instanceFlag := util.StringJoin([]string{in.ServiceId, in.InstanceId}, "/")
+	instanceFlag := util.StringJoin([]string{request.ServiceId, request.InstanceId}, "/")
 
-	instance, err := serviceUtil.GetInstance(ctx, domainProject, in.ServiceId, in.InstanceId)
+	instance, err := serviceUtil.GetInstance(ctx, domainProject, request.ServiceId, request.InstanceId)
 	if err != nil {
 		log.Errorf(err, "update instance[%s] properties failed", instanceFlag)
 		return &pb.UpdateInstancePropsResponse{
@@ -653,7 +654,7 @@ func (ds *DataSource) UpdateInstanceProperties(ctx context.Context, in *pb.Updat
 	}
 
 	copyInstanceRef := *instance
-	copyInstanceRef.Properties = in.Properties
+	copyInstanceRef.Properties = request.Properties
 
 	if err := serviceUtil.UpdateInstance(ctx, domainProject, &copyInstanceRef); err != nil {
 		log.Errorf(err, "update instance[%s] properties failed", instanceFlag)
@@ -672,16 +673,16 @@ func (ds *DataSource) UpdateInstanceProperties(ctx context.Context, in *pb.Updat
 	}, nil
 }
 
-func (ds *DataSource) HeartbeatSet(ctx context.Context, in *pb.HeartbeatSetRequest) (*pb.HeartbeatSetResponse, error) {
+func (ds *DataSource) HeartbeatSet(ctx context.Context, request *pb.HeartbeatSetRequest) (*pb.HeartbeatSetResponse, error) {
 	domainProject := util.ParseDomainProject(ctx)
 
-	heartBeatCount := len(in.Instances)
+	heartBeatCount := len(request.Instances)
 	existFlag := make(map[string]bool, heartBeatCount)
 	instancesHbRst := make(chan *pb.InstanceHbRst, heartBeatCount)
 	noMultiCounter := 0
-	for _, heartbeatElement := range in.Instances {
+	for _, heartbeatElement := range request.Instances {
 		if _, ok := existFlag[heartbeatElement.ServiceId+heartbeatElement.InstanceId]; ok {
-			log.Warnf("instance[%s/%s] is duplicate in heartbeat set",
+			log.Warnf("instance[%s/%s] is duplicate request heartbeat set",
 				heartbeatElement.ServiceId, heartbeatElement.InstanceId)
 			continue
 		} else {
@@ -713,58 +714,58 @@ func (ds *DataSource) HeartbeatSet(ctx context.Context, in *pb.HeartbeatSetReque
 			Instances: instanceHbRstArr,
 		}, nil
 	}
-	log.Errorf(nil, "batch update heartbeats failed, %v", in.Instances)
+	log.Errorf(nil, "batch update heartbeats failed, %v", request.Instances)
 	return &pb.HeartbeatSetResponse{
 		Response:  proto.CreateResponse(scerr.ErrInstanceNotExists, "Heartbeat set failed."),
 		Instances: instanceHbRstArr,
 	}, nil
 }
 
-func (ds *DataSource) GetInstances(ctx context.Context, in *pb.GetInstancesRequest) (*pb.GetInstancesResponse,
+func (ds *DataSource) GetInstances(ctx context.Context, request *pb.GetInstancesRequest) (*pb.GetInstancesResponse,
 	error) {
 	domainProject := util.ParseDomainProject(ctx)
 
 	service := &pb.MicroService{}
 	var err error
-	if len(in.ConsumerServiceId) > 0 {
-		service, err = serviceUtil.GetService(ctx, domainProject, in.ConsumerServiceId)
+	if len(request.ConsumerServiceId) > 0 {
+		service, err = serviceUtil.GetService(ctx, domainProject, request.ConsumerServiceId)
 		if err != nil {
 			log.Errorf(err, "get consumer failed, consumer[%s] find provider instances",
-				in.ConsumerServiceId, in.ProviderServiceId)
+				request.ConsumerServiceId, request.ProviderServiceId)
 			return &pb.GetInstancesResponse{
 				Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
 			}, err
 		}
 		if service == nil {
 			log.Errorf(nil, "consumer does not exist, consumer[%s] find provider instances",
-				in.ConsumerServiceId, in.ProviderServiceId)
+				request.ConsumerServiceId, request.ProviderServiceId)
 			return &pb.GetInstancesResponse{
 				Response: proto.CreateResponse(scerr.ErrServiceNotExists,
-					fmt.Sprintf("Consumer[%s] does not exist.", in.ConsumerServiceId)),
+					fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)),
 			}, nil
 		}
 	}
 
-	provider, err := serviceUtil.GetService(ctx, domainProject, in.ProviderServiceId)
+	provider, err := serviceUtil.GetService(ctx, domainProject, request.ProviderServiceId)
 	if err != nil {
 		log.Errorf(err, "get provider failed, consumer[%s] find provider instances",
-			in.ConsumerServiceId, in.ProviderServiceId)
+			request.ConsumerServiceId, request.ProviderServiceId)
 		return &pb.GetInstancesResponse{
 			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if provider == nil {
 		log.Errorf(nil, "provider does not exist, consumer[%s] find provider instances",
-			in.ConsumerServiceId, in.ProviderServiceId)
+			request.ConsumerServiceId, request.ProviderServiceId)
 		return &pb.GetInstancesResponse{
 			Response: proto.CreateResponse(scerr.ErrServiceNotExists,
-				fmt.Sprintf("Provider[%s] does not exist.", in.ProviderServiceId)),
+				fmt.Sprintf("Provider[%s] does not exist.", request.ProviderServiceId)),
 		}, nil
 	}
 
 	findFlag := func() string {
 		return fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find provider[%s][%s/%s/%s/%s] instances",
-			in.ConsumerServiceId, service.Environment, service.AppId, service.ServiceName, service.Version,
+			request.ConsumerServiceId, service.Environment, service.AppId, service.ServiceName, service.Version,
 			provider.ServiceId, provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
 	}
 
@@ -772,8 +773,8 @@ func (ds *DataSource) GetInstances(ctx context.Context, in *pb.GetInstancesReque
 	rev, _ := ctx.Value(util.CtxRequestRevision).(string)
 	item, err = cache.FindInstances.GetWithProviderID(ctx, service, proto.MicroServiceToKey(domainProject, provider),
 		&pb.HeartbeatSetElement{
-			ServiceId: in.ProviderServiceId,
-		}, in.Tags, rev)
+			ServiceId: request.ProviderServiceId,
+		}, request.Tags, rev)
 	if err != nil {
 		log.Errorf(err, "FindInstances.GetWithProviderID failed, %s failed", findFlag())
 		return &pb.GetInstancesResponse{
@@ -826,19 +827,19 @@ func (ds *DataSource) BatchFind(ctx context.Context, request *pb.BatchFindInstan
 	return response, nil
 }
 
-func (ds *DataSource) batchFindServices(ctx context.Context, in *pb.BatchFindInstancesRequest) (
+func (ds *DataSource) batchFindServices(ctx context.Context, request *pb.BatchFindInstancesRequest) (
 	*pb.BatchFindResult, error) {
-	if len(in.Services) == 0 {
+	if len(request.Services) == 0 {
 		return nil, nil
 	}
 	cloneCtx := util.CloneContext(ctx)
 
 	services := &pb.BatchFindResult{}
 	failedResult := make(map[int32]*pb.FindFailedResult)
-	for index, key := range in.Services {
+	for index, key := range request.Services {
 		findCtx := util.SetContext(cloneCtx, util.CtxRequestRevision, key.Rev)
 		resp, err := ds.FindInstances(findCtx, &pb.FindInstancesRequest{
-			ConsumerServiceId: in.ConsumerServiceId,
+			ConsumerServiceId: request.ConsumerServiceId,
 			AppId:             key.Service.AppId,
 			ServiceName:       key.Service.ServiceName,
 			VersionRule:       key.Service.Version,
@@ -860,8 +861,8 @@ func (ds *DataSource) batchFindServices(ctx context.Context, in *pb.BatchFindIns
 	return services, nil
 }
 
-func (ds *DataSource) batchFindInstances(ctx context.Context, in *pb.BatchFindInstancesRequest) (*pb.BatchFindResult, error) {
-	if len(in.Instances) == 0 {
+func (ds *DataSource) batchFindInstances(ctx context.Context, request *pb.BatchFindInstancesRequest) (*pb.BatchFindResult, error) {
+	if len(request.Instances) == 0 {
 		return nil, nil
 	}
 	cloneCtx := util.CloneContext(ctx)
@@ -870,10 +871,10 @@ func (ds *DataSource) batchFindInstances(ctx context.Context, in *pb.BatchFindIn
 
 	instances := &pb.BatchFindResult{}
 	failedResult := make(map[int32]*pb.FindFailedResult)
-	for index, key := range in.Instances {
+	for index, key := range request.Instances {
 		getCtx := util.SetContext(cloneCtx, util.CtxRequestRevision, key.Rev)
 		resp, err := ds.GetInstance(getCtx, &pb.GetOneInstanceRequest{
-			ConsumerServiceId:  in.ConsumerServiceId,
+			ConsumerServiceId:  request.ConsumerServiceId,
 			ProviderServiceId:  key.Instance.ServiceId,
 			ProviderInstanceId: key.Instance.InstanceId,
 		})
@@ -1020,14 +1021,6 @@ func (ds *DataSource) ModifySchema(ctx context.Context, request *pb.ModifySchema
 	}, nil
 }
 
-func (ds *DataSource) GetSchema() {
-	panic("implement me")
-}
-
-func (ds *DataSource) DeleteSchema() {
-	panic("implement me")
-}
-
 func (ds *DataSource) ExistSchema(ctx context.Context, request *pb.GetExistenceRequest) (
 	*pb.GetExistenceResponse, error) {
 	domainProject := util.ParseDomainProject(ctx)
@@ -1068,25 +1061,206 @@ func (ds *DataSource) ExistSchema(ctx context.Context, request *pb.GetExistenceR
 	}, nil
 }
 
-func (ds *DataSource) AddTags(ctx context.Context, in *pb.AddServiceTagsRequest) (*pb.AddServiceTagsResponse, error) {
+func (ds *DataSource) GetSchema(ctx context.Context, request *pb.GetSchemaRequest) (*pb.GetSchemaResponse, error) {
+	domainProject := util.ParseDomainProject(ctx)
+
+	if !serviceUtil.ServiceExist(ctx, domainProject, request.ServiceId) {
+		log.Errorf(nil, "get schema[%s/%s] failed, service does not exist",
+			request.ServiceId, request.SchemaId)
+		return &pb.GetSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
+		}, nil
+	}
+
+	key := apt.GenerateServiceSchemaKey(domainProject, request.ServiceId, request.SchemaId)
+	opts := append(serviceUtil.FromContext(ctx), registry.WithStrKey(key))
+	resp, errDo := backend.Store().Schema().Search(ctx, opts...)
+	if errDo != nil {
+		log.Errorf(errDo, "get schema[%s/%s] failed", request.ServiceId, request.SchemaId)
+		return &pb.GetSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrUnavailableBackend, errDo.Error()),
+		}, errDo
+	}
+	if resp.Count == 0 {
+		log.Errorf(errDo, "get schema[%s/%s] failed, schema does not exists",
+			request.ServiceId, request.SchemaId)
+		return &pb.GetSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrSchemaNotExists, "Do not have this schema info."),
+		}, nil
+	}
+
+	schemaSummary, err := getSchemaSummary(ctx, domainProject, request.ServiceId, request.SchemaId)
+	if err != nil {
+		log.Errorf(err, "get schema[%s/%s] failed, get schema summary failed",
+			request.ServiceId, request.SchemaId)
+		return &pb.GetSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
+		}, err
+	}
+
+	return &pb.GetSchemaResponse{
+		Response:      proto.CreateResponse(proto.Response_SUCCESS, "Get schema info successfully."),
+		Schema:        util.BytesToStringWithNoCopy(resp.Kvs[0].Value.([]byte)),
+		SchemaSummary: schemaSummary,
+	}, nil
+}
+
+func (ds *DataSource) GetAllSchemas(ctx context.Context, request *pb.GetAllSchemaRequest) (
+	*pb.GetAllSchemaResponse, error) {
+	domainProject := util.ParseDomainProject(ctx)
+
+	service, err := serviceUtil.GetService(ctx, domainProject, request.ServiceId)
+	if err != nil {
+		log.Errorf(err, "get service[%s] all schemas failed, get service failed", request.ServiceId)
+		return &pb.GetAllSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
+		}, err
+	}
+	if service == nil {
+		log.Errorf(nil, "get service[%s] all schemas failed, service does not exist", request.ServiceId)
+		return &pb.GetAllSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
+		}, nil
+	}
+
+	schemasList := service.Schemas
+	if len(schemasList) == 0 {
+		return &pb.GetAllSchemaResponse{
+			Response: proto.CreateResponse(proto.Response_SUCCESS, "Do not have this schema info."),
+			Schemas:  []*pb.Schema{},
+		}, nil
+	}
+
+	key := apt.GenerateServiceSchemaSummaryKey(domainProject, request.ServiceId, "")
+	opts := append(serviceUtil.FromContext(ctx), registry.WithStrKey(key), registry.WithPrefix())
+	resp, errDo := backend.Store().SchemaSummary().Search(ctx, opts...)
+	if errDo != nil {
+		log.Errorf(errDo, "get service[%s] all schema summaries failed", request.ServiceId)
+		return &pb.GetAllSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrUnavailableBackend, errDo.Error()),
+		}, errDo
+	}
+
+	respWithSchema := &discovery.Response{}
+	if request.WithSchema {
+		key := apt.GenerateServiceSchemaKey(domainProject, request.ServiceId, "")
+		opts := append(serviceUtil.FromContext(ctx), registry.WithStrKey(key), registry.WithPrefix())
+		respWithSchema, errDo = backend.Store().Schema().Search(ctx, opts...)
+		if errDo != nil {
+			log.Errorf(errDo, "get service[%s] all schemas failed", request.ServiceId)
+			return &pb.GetAllSchemaResponse{
+				Response: proto.CreateResponse(scerr.ErrUnavailableBackend, errDo.Error()),
+			}, errDo
+		}
+	}
+
+	schemas := make([]*pb.Schema, 0, len(schemasList))
+	for _, schemaID := range schemasList {
+		tempSchema := &pb.Schema{}
+		tempSchema.SchemaId = schemaID
+		for _, summarySchema := range resp.Kvs {
+			_, _, schemaIDOfSummary := apt.GetInfoFromSchemaSummaryKV(summarySchema.Key)
+			if schemaID == schemaIDOfSummary {
+				tempSchema.Summary = summarySchema.Value.(string)
+			}
+		}
+
+		for _, contentSchema := range respWithSchema.Kvs {
+			_, _, schemaIDOfSchema := apt.GetInfoFromSchemaKV(contentSchema.Key)
+			if schemaID == schemaIDOfSchema {
+				tempSchema.Schema = util.BytesToStringWithNoCopy(contentSchema.Value.([]byte))
+			}
+		}
+		schemas = append(schemas, tempSchema)
+	}
+
+	return &pb.GetAllSchemaResponse{
+		Response: proto.CreateResponse(proto.Response_SUCCESS, "Get all schema info successfully."),
+		Schemas:  schemas,
+	}, nil
+}
+
+func (ds *DataSource) DeleteSchema(ctx context.Context, request *pb.DeleteSchemaRequest) (
+	*pb.DeleteSchemaResponse, error) {
+	remoteIP := util.GetIPFromContext(ctx)
+	domainProject := util.ParseDomainProject(ctx)
+
+	if !serviceUtil.ServiceExist(ctx, domainProject, request.ServiceId) {
+		log.Errorf(nil, "delete schema[%s/%s] failed, service does not exist, operator: %s",
+			request.ServiceId, request.SchemaId, remoteIP)
+		return &pb.DeleteSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
+		}, nil
+	}
+
+	key := apt.GenerateServiceSchemaKey(domainProject, request.ServiceId, request.SchemaId)
+	exist, err := serviceUtil.CheckSchemaInfoExist(ctx, key)
+	if err != nil {
+		log.Errorf(err, "delete schema[%s/%s] failed, operator: %s",
+			request.ServiceId, request.SchemaId, remoteIP)
+		return &pb.DeleteSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
+		}, err
+	}
+	if !exist {
+		log.Errorf(nil, "delete schema[%s/%s] failed, schema does not exist, operator: %s",
+			request.ServiceId, request.SchemaId, remoteIP)
+		return &pb.DeleteSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrSchemaNotExists, "Schema info does not exist."),
+		}, nil
+	}
+	epSummaryKey := apt.GenerateServiceSchemaSummaryKey(domainProject, request.ServiceId, request.SchemaId)
+	opts := []registry.PluginOp{
+		registry.OpDel(registry.WithStrKey(epSummaryKey)),
+		registry.OpDel(registry.WithStrKey(key)),
+	}
+
+	resp, errDo := backend.Registry().TxnWithCmp(ctx, opts,
+		[]registry.CompareOp{registry.OpCmp(
+			registry.CmpVer(util.StringToBytesWithNoCopy(apt.GenerateServiceKey(domainProject, request.ServiceId))),
+			registry.CmpNotEqual, 0)},
+		nil)
+	if errDo != nil {
+		log.Errorf(errDo, "delete schema[%s/%s] failed, operator: %s",
+			request.ServiceId, request.SchemaId, remoteIP)
+		return &pb.DeleteSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrUnavailableBackend, errDo.Error()),
+		}, errDo
+	}
+	if !resp.Succeeded {
+		log.Errorf(nil, "delete schema[%s/%s] failed, service does not exist, operator: %s",
+			request.ServiceId, request.SchemaId, remoteIP)
+		return &pb.DeleteSchemaResponse{
+			Response: proto.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
+		}, nil
+	}
+
+	log.Infof("delete schema[%s/%s] info successfully, operator: %s",
+		request.ServiceId, request.SchemaId, remoteIP)
+	return &pb.DeleteSchemaResponse{
+		Response: proto.CreateResponse(proto.Response_SUCCESS, "Delete schema info successfully."),
+	}, nil
+}
+
+func (ds *DataSource) AddTags(ctx context.Context, request *pb.AddServiceTagsRequest) (*pb.AddServiceTagsResponse, error) {
 	remoteIP := util.GetIPFromContext(ctx)
 	domainProject := util.ParseDomainProject(ctx)
 
 	// service id存在性校验
-	if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
+	if !serviceUtil.ServiceExist(ctx, domainProject, request.ServiceId) {
 		log.Errorf(nil, "add service[%s]'s tags %v failed, service does not exist, operator: %s",
-			in.ServiceId, in.Tags, remoteIP)
+			request.ServiceId, request.Tags, remoteIP)
 		return &pb.AddServiceTagsResponse{
 			Response: proto.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
 	}
 
-	addTags := in.Tags
-	res := quota.NewApplyQuotaResource(quota.TagQuotaType, domainProject, in.ServiceId, int64(len(addTags)))
+	addTags := request.Tags
+	res := quota.NewApplyQuotaResource(quota.TagQuotaType, domainProject, request.ServiceId, int64(len(addTags)))
 	rst := plugin.Plugins().Quota().Apply4Quotas(ctx, res)
 	errQuota := rst.Err
 	if errQuota != nil {
-		log.Errorf(errQuota, "add service[%s]'s tags %v failed, operator: %s", in.ServiceId, addTags, remoteIP)
+		log.Errorf(errQuota, "add service[%s]'s tags %v failed, operator: %s", request.ServiceId, addTags, remoteIP)
 		response := &pb.AddServiceTagsResponse{
 			Response: proto.CreateResponseWithSCErr(errQuota),
 		}
@@ -1096,10 +1270,10 @@ func (ds *DataSource) AddTags(ctx context.Context, in *pb.AddServiceTagsRequest)
 		return response, nil
 	}
 
-	dataTags, err := serviceUtil.GetTagsUtils(ctx, domainProject, in.ServiceId)
+	dataTags, err := serviceUtil.GetTagsUtils(ctx, domainProject, request.ServiceId)
 	if err != nil {
 		log.Errorf(err, "add service[%s]'s tags %v failed, get existed tag failed, operator: %s",
-			in.ServiceId, addTags, remoteIP)
+			request.ServiceId, addTags, remoteIP)
 		return &pb.AddServiceTagsResponse{
 			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -1112,9 +1286,9 @@ func (ds *DataSource) AddTags(ctx context.Context, in *pb.AddServiceTagsRequest)
 	}
 	dataTags = addTags
 
-	checkErr := serviceUtil.AddTagIntoETCD(ctx, domainProject, in.ServiceId, dataTags)
+	checkErr := serviceUtil.AddTagIntoETCD(ctx, domainProject, request.ServiceId, dataTags)
 	if checkErr != nil {
-		log.Errorf(checkErr, "add service[%s]'s tags %v failed, operator: %s", in.ServiceId, in.Tags, remoteIP)
+		log.Errorf(checkErr, "add service[%s]'s tags %v failed, operator: %s", request.ServiceId, request.Tags, remoteIP)
 		resp := &pb.AddServiceTagsResponse{
 			Response: proto.CreateResponseWithSCErr(checkErr),
 		}
@@ -1124,7 +1298,7 @@ func (ds *DataSource) AddTags(ctx context.Context, in *pb.AddServiceTagsRequest)
 		return resp, nil
 	}
 
-	log.Infof("add service[%s]'s tags %v successfully, operator: %s", in.ServiceId, in.Tags, remoteIP)
+	log.Infof("add service[%s]'s tags %v successfully, operator: %s", request.ServiceId, request.Tags, remoteIP)
 	return &pb.AddServiceTagsResponse{
 		Response: proto.CreateResponse(proto.Response_SUCCESS, "Add service tags successfully."),
 	}, nil
@@ -1142,20 +1316,331 @@ func (ds *DataSource) DeleteTag() {
 	panic("implement me")
 }
 
-func (ds *DataSource) AddRule() {
-	panic("implement me")
+func (ds *DataSource) AddRule(ctx context.Context, request *pb.AddServiceRulesRequest) (
+	*pb.AddServiceRulesResponse, error) {
+	remoteIP := util.GetIPFromContext(ctx)
+	domainProject := util.ParseDomainProject(ctx)
+
+	// service id存在性校验
+	if !serviceUtil.ServiceExist(ctx, domainProject, request.ServiceId) {
+		log.Errorf(nil, "add service[%s] rule failed, service does not exist, operator: %s",
+			request.ServiceId, remoteIP)
+		return &pb.AddServiceRulesResponse{
+			Response: proto.CreateResponse(scerr.ErrInvalidParams, "Service does not exist."),
+		}, nil
+	}
+	res := quota.NewApplyQuotaResource(quota.RuleQuotaType, domainProject, request.ServiceId, int64(len(request.Rules)))
+	rst := plugin.Plugins().Quota().Apply4Quotas(ctx, res)
+	errQuota := rst.Err
+	if errQuota != nil {
+		log.Errorf(errQuota, "add service[%s] rule failed, operator: %s", request.ServiceId, remoteIP)
+		response := &pb.AddServiceRulesResponse{
+			Response: proto.CreateResponseWithSCErr(errQuota),
+		}
+		if errQuota.InternalError() {
+			return response, errQuota
+		}
+		return response, nil
+	}
+
+	ruleType, _, err := serviceUtil.GetServiceRuleType(ctx, domainProject, request.ServiceId)
+	if err != nil {
+		return &pb.AddServiceRulesResponse{
+			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
+		}, err
+	}
+	ruleIDs := make([]string, 0, len(request.Rules))
+	opts := make([]registry.PluginOp, 0, 2*len(request.Rules))
+	for _, rule := range request.Rules {
+		//黑白名单只能存在一种,黑名单 or 白名单
+		if len(ruleType) == 0 {
+			ruleType = rule.RuleType
+		} else if ruleType != rule.RuleType {
+			log.Errorf(nil,
+				"add service[%s] rule failed, can not add different RuleType at the same time, operator: %s",
+				request.ServiceId, remoteIP)
+			return &pb.AddServiceRulesResponse{
+				Response: proto.CreateResponse(scerr.ErrBlackAndWhiteRule,
+					"Service can only contain one rule type, BLACK or WHITE."),
+			}, nil
+
+		}
+
+		//同一服务,attribute和pattern确定一个rule
+		if serviceUtil.RuleExist(ctx, domainProject, request.ServiceId, rule.Attribute, rule.Pattern) {
+			log.Infof("service[%s] rule[%s/%s] already exists, operator: %s",
+				request.ServiceId, rule.Attribute, rule.Pattern, remoteIP)
+			continue
+		}
+
+		// 产生全局rule id
+		timestamp := strconv.FormatInt(time.Now().Unix(), 10)
+		ruleAdd := &pb.ServiceRule{
+			RuleId:       util.GenerateUUID(),
+			RuleType:     rule.RuleType,
+			Attribute:    rule.Attribute,
+			Pattern:      rule.Pattern,
+			Description:  rule.Description,
+			Timestamp:    timestamp,
+			ModTimestamp: timestamp,
+		}
+
+		key := apt.GenerateServiceRuleKey(domainProject, request.ServiceId, ruleAdd.RuleId)
+		indexKey := apt.GenerateRuleIndexKey(domainProject, request.ServiceId, ruleAdd.Attribute, ruleAdd.Pattern)
+		ruleIDs = append(ruleIDs, ruleAdd.RuleId)
+
+		data, err := json.Marshal(ruleAdd)
+		if err != nil {
+			log.Errorf(err, "add service[%s] rule failed, marshal rule[%s/%s] failed, operator: %s",
+				request.ServiceId, ruleAdd.Attribute, ruleAdd.Pattern, remoteIP)
+			return &pb.AddServiceRulesResponse{
+				Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
+			}, err
+		}
+
+		opts = append(opts, registry.OpPut(registry.WithStrKey(key), registry.WithValue(data)))
+		opts = append(opts, registry.OpPut(registry.WithStrKey(indexKey), registry.WithStrValue(ruleAdd.RuleId)))
+	}
+	if len(opts) <= 0 {
+		log.Infof("add service[%s] rule successfully, no rules to add, operator: %s",
+			request.ServiceId, remoteIP)
+		return &pb.AddServiceRulesResponse{
+			Response: proto.CreateResponse(proto.Response_SUCCESS, "Service rules has been added."),
+		}, nil
+	}
+
+	resp, err := backend.BatchCommitWithCmp(ctx, opts,
+		[]registry.CompareOp{registry.OpCmp(
+			registry.CmpVer(util.StringToBytesWithNoCopy(apt.GenerateServiceKey(domainProject, request.ServiceId))),
+			registry.CmpNotEqual, 0)},
+		nil)
+	if err != nil {
+		log.Errorf(err, "add service[%s] rule failed, operator: %s", request.ServiceId, remoteIP)
+		return &pb.AddServiceRulesResponse{
+			Response: proto.CreateResponse(scerr.ErrUnavailableBackend, err.Error()),
+		}, err
+	}
+	if !resp.Succeeded {
+		log.Errorf(nil, "add service[%s] rule failed, service does not exist, operator: %s",
+			request.ServiceId, remoteIP)
+		return &pb.AddServiceRulesResponse{
+			Response: proto.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
+		}, nil
+	}
+
+	log.Infof("add service[%s] rule %v successfully, operator: %s", request.ServiceId, ruleIDs, remoteIP)
+	return &pb.AddServiceRulesResponse{
+		Response: proto.CreateResponse(proto.Response_SUCCESS, "Add service rules successfully."),
+		RuleIds:  ruleIDs,
+	}, nil
 }
 
-func (ds *DataSource) GetRule() {
-	panic("implement me")
+func (ds *DataSource) GetRule(ctx context.Context, request *pb.GetServiceRulesRequest) (
+	*pb.GetServiceRulesResponse, error) {
+	domainProject := util.ParseDomainProject(ctx)
+
+	// service id存在性校验
+	if !serviceUtil.ServiceExist(ctx, domainProject, request.ServiceId) {
+		log.Errorf(nil, "get service[%s] rule failed, service does not exist", request.ServiceId)
+		return &pb.GetServiceRulesResponse{
+			Response: proto.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
+		}, nil
+	}
+
+	rules, err := serviceUtil.GetRulesUtil(ctx, domainProject, request.ServiceId)
+	if err != nil {
+		log.Errorf(err, "get service[%s] rule failed", request.ServiceId)
+		return &pb.GetServiceRulesResponse{
+			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
+		}, err
+	}
+
+	return &pb.GetServiceRulesResponse{
+		Response: proto.CreateResponse(proto.Response_SUCCESS, "Get service rules successfully."),
+		Rules:    rules,
+	}, nil
 }
 
-func (ds *DataSource) UpdateRule() {
-	panic("implement me")
+func (ds *DataSource) UpdateRule(ctx context.Context, request *pb.UpdateServiceRuleRequest) (
+	*pb.UpdateServiceRuleResponse, error) {
+	remoteIP := util.GetIPFromContext(ctx)
+	domainProject := util.ParseDomainProject(ctx)
+
+	// service id存在性校验
+	if !serviceUtil.ServiceExist(ctx, domainProject, request.ServiceId) {
+		log.Errorf(nil, "update service rule[%s/%s] failed, service does not exist, operator: %s",
+			request.ServiceId, request.RuleId, remoteIP)
+		return &pb.UpdateServiceRuleResponse{
+			Response: proto.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
+		}, nil
+	}
+
+	//是否能改变ruleType
+	ruleType, ruleNum, err := serviceUtil.GetServiceRuleType(ctx, domainProject, request.ServiceId)
+	if err != nil {
+		log.Errorf(err, "update service rule[%s/%s] failed, get rule type failed, operator: %s",
+			request.ServiceId, request.RuleId, remoteIP)
+		return &pb.UpdateServiceRuleResponse{
+			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
+		}, err
+	}
+	if ruleNum >= 1 && ruleType != request.Rule.RuleType {
+		log.Errorf(err, "update service rule[%s/%s] failed, can only exist one type, current type is %s, operator: %s",
+			request.ServiceId, request.RuleId, ruleType, remoteIP)
+		return &pb.UpdateServiceRuleResponse{
+			Response: proto.CreateResponse(scerr.ErrModifyRuleNotAllow, "Exist multiple rules,can not change rule type. Rule type is "+ruleType),
+		}, nil
+	}
+
+	rule, err := serviceUtil.GetOneRule(ctx, domainProject, request.ServiceId, request.RuleId)
+	if err != nil {
+		log.Errorf(err, "update service rule[%s/%s] failed, query service rule failed, operator: %s",
+			request.ServiceId, request.RuleId, remoteIP)
+		return &pb.UpdateServiceRuleResponse{
+			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
+		}, err
+	}
+	if rule == nil {
+		log.Errorf(err, "update service rule[%s/%s] failed, service rule does not exist, operator: %s",
+			request.ServiceId, request.RuleId, remoteIP)
+		return &pb.UpdateServiceRuleResponse{
+			Response: proto.CreateResponse(scerr.ErrRuleNotExists, "This rule does not exist."),
+		}, nil
+	}
+
+	copyRuleRef := *rule
+	oldRulePatten := copyRuleRef.Pattern
+	oldRuleAttr := copyRuleRef.Attribute
+	isChangeIndex := false
+	if copyRuleRef.Attribute != request.Rule.Attribute {
+		isChangeIndex = true
+		copyRuleRef.Attribute = request.Rule.Attribute
+	}
+	if copyRuleRef.Pattern != request.Rule.Pattern {
+		isChangeIndex = true
+		copyRuleRef.Pattern = request.Rule.Pattern
+	}
+	copyRuleRef.RuleType = request.Rule.RuleType
+	copyRuleRef.Description = request.Rule.Description
+	copyRuleRef.ModTimestamp = strconv.FormatInt(time.Now().Unix(), 10)
+
+	key := apt.GenerateServiceRuleKey(domainProject, request.ServiceId, request.RuleId)
+	data, err := json.Marshal(copyRuleRef)
+	if err != nil {
+		log.Errorf(err, "update service rule[%s/%s] failed, marshal service rule failed, operator: %s",
+			request.ServiceId, request.RuleId, remoteIP)
+		return &pb.UpdateServiceRuleResponse{
+			Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
+		}, err
+	}
+	var opts []registry.PluginOp
+	if isChangeIndex {
+		//加入新的rule index
+		indexKey := apt.GenerateRuleIndexKey(domainProject, request.ServiceId, copyRuleRef.Attribute, copyRuleRef.Pattern)
+		opts = append(opts, registry.OpPut(registry.WithStrKey(indexKey), registry.WithStrValue(copyRuleRef.RuleId)))
+
+		//删除旧的rule index
+		oldIndexKey := apt.GenerateRuleIndexKey(domainProject, request.ServiceId, oldRuleAttr, oldRulePatten)
+		opts = append(opts, registry.OpDel(registry.WithStrKey(oldIndexKey)))
+	}
+	opts = append(opts, registry.OpPut(registry.WithStrKey(key), registry.WithValue(data)))
+
+	resp, err := backend.Registry().TxnWithCmp(ctx, opts,
+		[]registry.CompareOp{registry.OpCmp(
+			registry.CmpVer(util.StringToBytesWithNoCopy(apt.GenerateServiceKey(domainProject, request.ServiceId))),
+			registry.CmpNotEqual, 0)},
+		nil)
+	if err != nil {
+		log.Errorf(err, "update service rule[%s/%s] failed, operator: %s", request.ServiceId, request.RuleId, remoteIP)
+		return &pb.UpdateServiceRuleResponse{
+			Response: proto.CreateResponse(scerr.ErrUnavailableBackend, err.Error()),
+		}, err
+	}
+	if !resp.Succeeded {
+		log.Errorf(err, "update service rule[%s/%s] failed, service does not exist, operator: %s",
+			request.ServiceId, request.RuleId, remoteIP)
+		return &pb.UpdateServiceRuleResponse{
+			Response: proto.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
+		}, nil
+	}
+
+	log.Infof("update service rule[%s/%s] successfully, operator: %s", request.ServiceId, request.RuleId, remoteIP)
+	return &pb.UpdateServiceRuleResponse{
+		Response: proto.CreateResponse(proto.Response_SUCCESS, "Get service rules successfully."),
+	}, nil
 }
 
-func (ds *DataSource) DeleteRule() {
-	panic("implement me")
+func (ds *DataSource) DeleteRule(ctx context.Context, request *pb.DeleteServiceRulesRequest) (
+	*pb.DeleteServiceRulesResponse, error) {
+	remoteIP := util.GetIPFromContext(ctx)
+	domainProject := util.ParseDomainProject(ctx)
+
+	// service id存在性校验
+	if !serviceUtil.ServiceExist(ctx, domainProject, request.ServiceId) {
+		log.Errorf(nil, "delete service[%s] rules %v failed, service does not exist, operator: %s",
+			request.ServiceId, request.RuleIds, remoteIP)
+		return &pb.DeleteServiceRulesResponse{
+			Response: proto.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
+		}, nil
+	}
+
+	opts := []registry.PluginOp{}
+	key := ""
+	indexKey := ""
+	for _, ruleID := range request.RuleIds {
+		key = apt.GenerateServiceRuleKey(domainProject, request.ServiceId, ruleID)
+		log.Debugf("start delete service rule file: %s", key)
+		data, err := serviceUtil.GetOneRule(ctx, domainProject, request.ServiceId, ruleID)
+		if err != nil {
+			log.Errorf(err, "delete service[%s] rules %v failed, get rule[%s] failed, operator: %s",
+				request.ServiceId, request.RuleIds, ruleID, remoteIP)
+			return &pb.DeleteServiceRulesResponse{
+				Response: proto.CreateResponse(scerr.ErrInternal, err.Error()),
+			}, err
+		}
+		if data == nil {
+			log.Errorf(nil, "delete service[%s] rules %v failed, rule[%s] does not exist, operator: %s",
+				request.ServiceId, request.RuleIds, ruleID, remoteIP)
+			return &pb.DeleteServiceRulesResponse{
+				Response: proto.CreateResponse(scerr.ErrRuleNotExists, "This rule does not exist."),
+			}, nil
+		}
+		indexKey = apt.GenerateRuleIndexKey(domainProject, request.ServiceId, data.Attribute, data.Pattern)
+		opts = append(opts,
+			registry.OpDel(registry.WithStrKey(key)),
+			registry.OpDel(registry.WithStrKey(indexKey)))
+	}
+	if len(opts) <= 0 {
+		log.Errorf(nil, "delete service[%s] rules %v failed, no rule has been deleted, operator: %s",
+			request.ServiceId, request.RuleIds, remoteIP)
+		return &pb.DeleteServiceRulesResponse{
+			Response: proto.CreateResponse(scerr.ErrRuleNotExists, "No service rule has been deleted."),
+		}, nil
+	}
+
+	resp, err := backend.BatchCommitWithCmp(ctx, opts,
+		[]registry.CompareOp{registry.OpCmp(
+			registry.CmpVer(util.StringToBytesWithNoCopy(apt.GenerateServiceKey(domainProject, request.ServiceId))),
+			registry.CmpNotEqual, 0)},
+		nil)
+	if err != nil {
+		log.Errorf(err, "delete service[%s] rules %v failed, operator: %s", request.ServiceId, request.RuleIds, remoteIP)
+		return &pb.DeleteServiceRulesResponse{
+			Response: proto.CreateResponse(scerr.ErrUnavailableBackend, err.Error()),
+		}, err
+	}
+	if !resp.Succeeded {
+		log.Errorf(err, "delete service[%s] rules %v failed, service does not exist, operator: %s",
+			request.ServiceId, request.RuleIds, remoteIP)
+		return &pb.DeleteServiceRulesResponse{
+			Response: proto.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
+		}, nil
+	}
+
+	log.Infof("delete service[%s] rules %v successfully, operator: %s", request.ServiceId, request.RuleIds, remoteIP)
+	return &pb.DeleteServiceRulesResponse{
+		Response: proto.CreateResponse(proto.Response_SUCCESS, "Delete service rules successfully."),
+	}, nil
 }
 
 func (ds *DataSource) modifySchemas(ctx context.Context, domainProject string, service *pb.MicroService,
@@ -1302,7 +1787,7 @@ func (ds *DataSource) modifySchema(ctx context.Context, serviceID string, schema
 
 	if !ds.isSchemaEditable(microService) {
 		if len(microService.Schemas) != 0 && !isExist {
-			return scerr.NewError(scerr.ErrUndefinedSchemaID, "Non-existent schemaID can't be added in "+pb.ENV_PROD)
+			return scerr.NewError(scerr.ErrUndefinedSchemaID, "Non-existent schemaID can't be added request "+pb.ENV_PROD)
 		}
 
 		key := apt.GenerateServiceSchemaKey(domainProject, serviceID, schemaID)
@@ -1318,7 +1803,7 @@ func (ds *DataSource) modifySchema(ctx context.Context, serviceID string, schema
 				log.Errorf(err, "%s mode, schema[%s/%s] already exists, can not be changed, operator: %s",
 					pb.ENV_PROD, serviceID, schemaID, remoteIP)
 				return scerr.NewError(scerr.ErrModifySchemaNotAllow,
-					"schema already exist, can not be changed in "+pb.ENV_PROD)
+					"schema already exist, can not be changed request "+pb.ENV_PROD)
 			}
 
 			exist, err := isExistSchemaSummary(ctx, domainProject, serviceID, schemaID)
@@ -1330,7 +1815,7 @@ func (ds *DataSource) modifySchema(ctx context.Context, serviceID string, schema
 			if exist {
 				log.Errorf(err, "%s mode, schema[%s/%s] already exist, can not be changed, operator: %s",
 					pb.ENV_PROD, serviceID, schemaID, remoteIP)
-				return scerr.NewError(scerr.ErrModifySchemaNotAllow, "schema already exist, can not be changed in "+pb.ENV_PROD)
+				return scerr.NewError(scerr.ErrModifySchemaNotAllow, "schema already exist, can not be changed request "+pb.ENV_PROD)
 			}
 		}
 
diff --git a/datasource/etcd/ms_test.go b/datasource/etcd/ms_test.go
index f358f8c..948be0a 100644
--- a/datasource/etcd/ms_test.go
+++ b/datasource/etcd/ms_test.go
@@ -2776,11 +2776,825 @@ func TestSchema_Exist(t *testing.T) {
 	})
 }
 
-func TestTag_Add(t *testing.T) {
+func TestSchema_Get(t *testing.T) {
+	datasource.Install("etcd", func(opts datasource.Options) (datasource.DataSource, error) {
+		return NewDataSource(opts), nil
+	})
+	err := datasource.Init(datasource.Options{
+		Endpoint:       "",
+		PluginImplName: datasource.ImplName(archaius.GetString("servicecomb.datasource.name", "etcd")),
+	})
+	assert.NoError(t, err)
+
+	var (
+		serviceId  string
+		serviceId1 string
+	)
+
+	var (
+		schemaId1     string = "all_schema1_ms"
+		schemaId2     string = "all_schema2_ms"
+		schemaId3     string = "all_schema3_ms"
+		summary       string = "this0is1a2test3ms"
+		schemaContent string = "the content is vary large"
+	)
+
+	t.Run("register service and instance", func(t *testing.T) {
+		respCreateService, err := datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "get_schema_group_ms",
+				ServiceName: "get_schema_service_ms",
+				Version:     "1.0.0",
+				Level:       "FRONT",
+				Schemas: []string{
+					"non-schema-content",
+				},
+				Status:      pb.MS_UP,
+				Environment: pb.ENV_DEV,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		serviceId = respCreateService.ServiceId
+
+		respCreateSchema, err := datasource.Instance().ModifySchema(getContext(), &pb.ModifySchemaRequest{
+			ServiceId: serviceId,
+			SchemaId:  "com.huawei.test.ms",
+			Schema:    "get schema ms",
+			Summary:   "schema0summary1ms",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateSchema.Response.GetCode())
+
+		respCreateService, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "get_all_schema_ms",
+				ServiceName: "get_all_schema_ms",
+				Version:     "1.0.0",
+				Level:       "FRONT",
+				Schemas: []string{
+					schemaId1,
+					schemaId2,
+					schemaId3,
+				},
+				Status: pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		serviceId1 = respCreateService.ServiceId
+
+		respPutData, err := datasource.Instance().ModifySchema(getContext(), &pb.ModifySchemaRequest{
+			ServiceId: serviceId1,
+			SchemaId:  schemaId2,
+			Schema:    schemaContent,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respPutData.Response.GetCode())
+
+		respPutData, err = datasource.Instance().ModifySchema(getContext(), &pb.ModifySchemaRequest{
+			ServiceId: serviceId1,
+			SchemaId:  schemaId3,
+			Schema:    schemaContent,
+			Summary:   summary,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respPutData.Response.GetCode())
+
+		respGetAllSchema, err := datasource.Instance().GetAllSchemas(getContext(), &pb.GetAllSchemaRequest{
+			ServiceId:  serviceId1,
+			WithSchema: false,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respGetAllSchema.Response.GetCode())
+		schemas := respGetAllSchema.Schemas
+		for _, schema := range schemas {
+			if schema.SchemaId == schemaId1 && schema.SchemaId == schemaId2 {
+				assert.Empty(t, schema.Summary)
+				assert.Empty(t, schema.Schema)
+			}
+			if schema.SchemaId == schemaId3 {
+				assert.Equal(t, summary, schema.Summary)
+				assert.Empty(t, schema.Schema)
+			}
+		}
+
+		respGetAllSchema, err = datasource.Instance().GetAllSchemas(getContext(), &pb.GetAllSchemaRequest{
+			ServiceId:  serviceId1,
+			WithSchema: true,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respGetAllSchema.Response.GetCode())
+		schemas = respGetAllSchema.Schemas
+		for _, schema := range schemas {
+			switch schema.SchemaId {
+			case schemaId1:
+				assert.Empty(t, schema.Summary)
+				assert.Empty(t, schema.Schema)
+			case schemaId2:
+				assert.Empty(t, schema.Summary)
+				assert.Equal(t, schemaContent, schema.Schema)
+			case schemaId3:
+				assert.Equal(t, summary, schema.Summary)
+				assert.Equal(t, schemaContent, schema.Schema)
+			}
+		}
+	})
+
+	t.Run("test get when request is invalid", func(t *testing.T) {
+		log.Info("service does not exist")
+		respGetSchema, err := datasource.Instance().GetSchema(getContext(), &pb.GetSchemaRequest{
+			ServiceId: "none_exist_service",
+			SchemaId:  "com.huawei.test",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrServiceNotExists, respGetSchema.Response.GetCode())
+
+		respGetAllSchemas, err := datasource.Instance().GetAllSchemas(getContext(), &pb.GetAllSchemaRequest{
+			ServiceId: "none_exist_service",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrServiceNotExists, respGetAllSchemas.Response.GetCode())
+
+		log.Info("schema id doest not exist")
+		respGetSchema, err = datasource.Instance().GetSchema(getContext(), &pb.GetSchemaRequest{
+			ServiceId: serviceId,
+			SchemaId:  "none_exist_schema",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrSchemaNotExists, respGetSchema.Response.GetCode())
+	})
+
+	t.Run("test get when request is valid", func(t *testing.T) {
+		resp, err := datasource.Instance().GetSchema(getContext(), &pb.GetSchemaRequest{
+			ServiceId: serviceId,
+			SchemaId:  "com.huawei.test.ms",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+		assert.Equal(t, "get schema ms", resp.Schema)
+		assert.Equal(t, "schema0summary1ms", resp.SchemaSummary)
+
+	})
+}
+
+func TestSchema_Delete(t *testing.T) {
+	datasource.Install("etcd", func(opts datasource.Options) (datasource.DataSource, error) {
+		return NewDataSource(opts), nil
+	})
+	err := datasource.Init(datasource.Options{
+		Endpoint:       "",
+		PluginImplName: datasource.ImplName(archaius.GetString("servicecomb.datasource.name", "etcd")),
+	})
+	assert.NoError(t, err)
+
+	var (
+		serviceId string
+	)
+
+	t.Run("register service and instance", func(t *testing.T) {
+		respCreateService, err := datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "delete_schema_group_ms",
+				ServiceName: "delete_schema_service_ms",
+				Version:     "1.0.0",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		serviceId = respCreateService.ServiceId
+
+		resp, err := datasource.Instance().ModifySchema(getContext(), &pb.ModifySchemaRequest{
+			ServiceId: serviceId,
+			SchemaId:  "com.huawei.test.ms",
+			Schema:    "delete schema ms",
+			Summary:   "summary_ms",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+	})
+
+	t.Run("test delete when request is invalid", func(t *testing.T) {
+		log.Info("schema id does not exist")
+		resp, err := datasource.Instance().DeleteSchema(getContext(), &pb.DeleteSchemaRequest{
+			ServiceId: serviceId,
+			SchemaId:  "none_exist_schema",
+		})
+		assert.NoError(t, err)
+		assert.NotEqual(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+		log.Info("service id does not exist")
+		resp, err = datasource.Instance().DeleteSchema(getContext(), &pb.DeleteSchemaRequest{
+			ServiceId: "not_exist_service",
+			SchemaId:  "com.huawei.test.ms",
+		})
+		assert.NoError(t, err)
+		assert.NotEqual(t, proto.Response_SUCCESS, resp.Response.GetCode())
+	})
+
+	t.Run("test delete when request is valid", func(t *testing.T) {
+		resp, err := datasource.Instance().DeleteSchema(getContext(), &pb.DeleteSchemaRequest{
+			ServiceId: serviceId,
+			SchemaId:  "com.huawei.test.ms",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+		respGet, err := datasource.Instance().GetSchema(getContext(), &pb.GetSchemaRequest{
+			ServiceId: serviceId,
+			SchemaId:  "com.huawei.test.ms",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrSchemaNotExists, respGet.Response.GetCode())
+
+		respExist, err := datasource.Instance().ExistSchema(getContext(), &pb.GetExistenceRequest{
+			Type:      "schema",
+			ServiceId: serviceId,
+			SchemaId:  "com.huawei.test.ms",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrSchemaNotExists, respExist.Response.GetCode())
+	})
+}
+
+func TestRule_Add(t *testing.T) {
+	datasource.Install("etcd", func(opts datasource.Options) (datasource.DataSource, error) {
+		return NewDataSource(opts), nil
+	})
+	err := datasource.Init(datasource.Options{
+		Endpoint:       "",
+		PluginImplName: datasource.ImplName(archaius.GetString("servicecomb.datasource.name", "etcd")),
+	})
+	assert.NoError(t, err)
+
+	var (
+		serviceId1 string
+		serviceId2 string
+	)
+
+	t.Run("register service and instance", func(t *testing.T) {
+		respCreateService, err := datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "create_rule_group_ms",
+				ServiceName: "create_rule_service_ms",
+				Version:     "1.0.0",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		serviceId1 = respCreateService.ServiceId
+
+		respCreateService, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "create_rule_group_ms",
+				ServiceName: "create_rule_service_ms",
+				Version:     "1.0.1",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		serviceId2 = respCreateService.ServiceId
+	})
+
+	t.Run("invalid request", func(t *testing.T) {
+		log.Info("service does not exist")
+		respAddRule, err := datasource.Instance().AddRule(getContext(), &pb.AddServiceRulesRequest{
+			ServiceId: "not_exist_service_ms",
+			Rules: []*pb.AddOrUpdateServiceRule{
+				{
+					RuleType:    "BLACK",
+					Attribute:   "ServiceName",
+					Pattern:     "Test*",
+					Description: "test white",
+				},
+			},
+		})
+		assert.NoError(t, err)
+		assert.NotEqual(t, proto.Response_SUCCESS, respAddRule)
+	})
+
+	t.Run("request is valid", func(t *testing.T) {
+		log.Info("create a new black list")
+		respAddRule, err := datasource.Instance().AddRule(getContext(), &pb.AddServiceRulesRequest{
+			ServiceId: serviceId1,
+			Rules: []*pb.AddOrUpdateServiceRule{
+				{
+					RuleType:    "BLACK",
+					Attribute:   "ServiceName",
+					Pattern:     "Test*",
+					Description: "test black",
+				},
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respAddRule.Response.GetCode())
+		ruleId := respAddRule.RuleIds[0]
+		assert.NotEqual(t, "", ruleId)
+
+		log.Info("create the black list again")
+		respAddRule, err = datasource.Instance().AddRule(getContext(), &pb.AddServiceRulesRequest{
+			ServiceId: serviceId1,
+			Rules: []*pb.AddOrUpdateServiceRule{
+				{
+					RuleType:    "BLACK",
+					Attribute:   "ServiceName",
+					Pattern:     "Test*",
+					Description: "test change black",
+				},
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respAddRule.Response.GetCode())
+		assert.Equal(t, 0, len(respAddRule.RuleIds))
+
+		log.Info("create a new white list when black list already exists")
+		respAddRule, err = datasource.Instance().AddRule(getContext(), &pb.AddServiceRulesRequest{
+			ServiceId: serviceId1,
+			Rules: []*pb.AddOrUpdateServiceRule{
+				{
+					RuleType:    "WHITE",
+					Attribute:   "ServiceName",
+					Pattern:     "Test*",
+					Description: "test white",
+				},
+			},
+		})
+		assert.NoError(t, err)
+		assert.NotEqual(t, proto.Response_SUCCESS, respAddRule.Response.GetCode())
+	})
+
+	t.Run("create rule out of gaugue", func(t *testing.T) {
+		size := quota.DefaultRuleQuota + 1
+		rules := make([]*pb.AddOrUpdateServiceRule, 0, size)
+		for i := 0; i < size; i++ {
+			rules = append(rules, &pb.AddOrUpdateServiceRule{
+				RuleType:    "BLACK",
+				Attribute:   "ServiceName",
+				Pattern:     strconv.Itoa(i),
+				Description: "test white",
+			})
+		}
+
+		resp, err := datasource.Instance().AddRule(getContext(), &pb.AddServiceRulesRequest{
+			ServiceId: serviceId2,
+			Rules:     rules[:size-1],
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+		resp, err = datasource.Instance().AddRule(getContext(), &pb.AddServiceRulesRequest{
+			ServiceId: serviceId2,
+			Rules:     rules[size-1:],
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrNotEnoughQuota, resp.Response.GetCode())
+	})
+}
+
+func TestRule_Get(t *testing.T) {
+	datasource.Install("etcd", func(opts datasource.Options) (datasource.DataSource, error) {
+		return NewDataSource(opts), nil
+	})
+	err := datasource.Init(datasource.Options{
+		Endpoint:       "",
+		PluginImplName: datasource.ImplName(archaius.GetString("servicecomb.datasource.name", "etcd")),
+	})
+	assert.NoError(t, err)
+
+	var (
+		serviceId string
+		ruleId    string
+	)
+
+	t.Run("register service and rules", func(t *testing.T) {
+		respCreateService, err := datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "get_rule_group_ms",
+				ServiceName: "get_rule_service_ms",
+				Version:     "1.0.0",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		serviceId = respCreateService.ServiceId
+
+		respAddRule, err := datasource.Instance().AddRule(getContext(), &pb.AddServiceRulesRequest{
+			ServiceId: serviceId,
+			Rules: []*pb.AddOrUpdateServiceRule{
+				{
+					RuleType:    "BLACK",
+					Attribute:   "ServiceName",
+					Pattern:     "Test*",
+					Description: "test BLACK",
+				},
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respAddRule.Response.GetCode())
+		ruleId = respAddRule.RuleIds[0]
+		assert.NotEqual(t, "", ruleId)
+	})
+
+	t.Run("get when request is invalid", func(t *testing.T) {
+		log.Info("service not exists")
+		respGetRule, err := datasource.Instance().GetRule(getContext(), &pb.GetServiceRulesRequest{
+			ServiceId: "not_exist_service_ms",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrServiceNotExists, respGetRule.Response.GetCode())
+	})
+
+	t.Run("get when request is valid", func(t *testing.T) {
+		respGetRule, err := datasource.Instance().GetRule(getContext(), &pb.GetServiceRulesRequest{
+			ServiceId: serviceId,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respGetRule.Response.GetCode())
+		assert.Equal(t, ruleId, respGetRule.Rules[0].RuleId)
+	})
+}
+
+func TestRule_Update(t *testing.T) {
+	datasource.Install("etcd", func(opts datasource.Options) (datasource.DataSource, error) {
+		return NewDataSource(opts), nil
+	})
+	err := datasource.Init(datasource.Options{
+		Endpoint:       "",
+		PluginImplName: datasource.ImplName(archaius.GetString("servicecomb.datasource.name", "etcd")),
+	})
+	assert.NoError(t, err)
+
+	var (
+		serviceId string
+		ruleId    string
+	)
+
+	t.Run("create service and rules", func(t *testing.T) {
+		respCreateService, err := datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "update_rule_group_ms",
+				ServiceName: "update_rule_service_ms",
+				Version:     "1.0.0",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		serviceId = respCreateService.ServiceId
+
+		respAddRule, err := datasource.Instance().AddRule(getContext(), &pb.AddServiceRulesRequest{
+			ServiceId: serviceId,
+			Rules: []*pb.AddOrUpdateServiceRule{
+				{
+					RuleType:    "BLACK",
+					Attribute:   "ServiceName",
+					Pattern:     "Test*",
+					Description: "test BLACK",
+				},
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respAddRule.Response.GetCode())
+		ruleId = respAddRule.RuleIds[0]
+		assert.NotEqual(t, "", ruleId)
+	})
+
+	t.Run("update when request is invalid", func(t *testing.T) {
+		rule := &pb.AddOrUpdateServiceRule{
+			RuleType:    "BLACK",
+			Attribute:   "ServiceName",
+			Pattern:     "Test*",
+			Description: "test BLACK update",
+		}
+		log.Info("service does not exist")
+		resp, err := datasource.Instance().UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
+			ServiceId: "not_exist_service_ms",
+			RuleId:    ruleId,
+			Rule:      rule,
+		})
+		assert.NoError(t, err)
+		assert.NotEqual(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+		log.Info("rule not exists")
+		resp, err = datasource.Instance().UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
+			ServiceId: serviceId,
+			RuleId:    "not_exist_rule_ms",
+			Rule:      rule,
+		})
+		assert.NoError(t, err)
+		assert.NotEqual(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+		log.Info("change rule type")
+		resp, err = datasource.Instance().UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
+			ServiceId: serviceId,
+			RuleId:    ruleId,
+			Rule: &pb.AddOrUpdateServiceRule{
+				RuleType:    "WHITE",
+				Attribute:   "ServiceName",
+				Pattern:     "Test*",
+				Description: "test white update",
+			},
+		})
+		assert.NoError(t, err)
+		assert.NotEqual(t, proto.Response_SUCCESS, resp.Response.GetCode())
+	})
+
+	t.Run("update when request is valid", func(t *testing.T) {
+		resp, err := datasource.Instance().UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
+			ServiceId: serviceId,
+			RuleId:    ruleId,
+			Rule: &pb.AddOrUpdateServiceRule{
+				RuleType:    "BLACK",
+				Attribute:   "AppId",
+				Pattern:     "Test*",
+				Description: "test white update",
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+	})
+}
+
+func TestRule_Delete(t *testing.T) {
+	datasource.Install("etcd", func(opts datasource.Options) (datasource.DataSource, error) {
+		return NewDataSource(opts), nil
+	})
+	err := datasource.Init(datasource.Options{
+		Endpoint:       "",
+		PluginImplName: datasource.ImplName(archaius.GetString("servicecomb.datasource.name", "etcd")),
+	})
+	assert.NoError(t, err)
+
+	var (
+		serviceId string
+		ruleId    string
+	)
+	t.Run("register service and rules", func(t *testing.T) {
+		respCreateService, err := datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "delete_rule_group_ms",
+				ServiceName: "delete_rule_service_ms",
+				Version:     "1.0.0",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		serviceId = respCreateService.ServiceId
+
+		respAddRule, err := datasource.Instance().AddRule(getContext(), &pb.AddServiceRulesRequest{
+			ServiceId: serviceId,
+			Rules: []*pb.AddOrUpdateServiceRule{
+				{
+					RuleType:    "BLACK",
+					Attribute:   "ServiceName",
+					Pattern:     "Test*",
+					Description: "test BLACK",
+				},
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respAddRule.Response.GetCode())
+		ruleId = respAddRule.RuleIds[0]
+		assert.NotEqual(t, "", ruleId)
+	})
+
+	t.Run("delete when request is invalid", func(t *testing.T) {
+		log.Info("service not exist")
+		resp, err := datasource.Instance().DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
+			ServiceId: "not_exist_service_ms",
+			RuleIds:   []string{"1000000"},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrServiceNotExists, resp.Response.GetCode())
+
+		log.Info("rule not exist")
+		resp, err = datasource.Instance().DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
+			ServiceId: serviceId,
+			RuleIds:   []string{"not_exist_rule"},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrRuleNotExists, resp.Response.GetCode())
+	})
+
+	t.Run("delete when request is valid", func(t *testing.T) {
+		resp, err := datasource.Instance().DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
+			ServiceId: serviceId,
+			RuleIds:   []string{ruleId},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+		respGetRule, err := datasource.Instance().GetRule(getContext(), &pb.GetServiceRulesRequest{
+			ServiceId: serviceId,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+		assert.Equal(t, 0, len(respGetRule.Rules))
+	})
+}
+
+func TestRule_Permission(t *testing.T) {
+	datasource.Install("etcd", func(opts datasource.Options) (datasource.DataSource, error) {
+		return NewDataSource(opts), nil
+	})
+	err := datasource.Init(datasource.Options{
+		Endpoint:       "",
+		PluginImplName: datasource.ImplName(archaius.GetString("servicecomb.datasource.name", "etcd")),
+	})
+	assert.NoError(t, err)
+
+	var (
+		consumerVersion string
+		consumerTag     string
+		providerBlack   string
+		providerWhite   string
+	)
+	t.Run("register service and rules", func(t *testing.T) {
+		respCreateService, err := datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "query_instance_tag_ms",
+				ServiceName: "query_instance_version_consumer_ms",
+				Version:     "1.0.0",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		consumerVersion = respCreateService.ServiceId
+
+		respCreateService, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "query_instance_tag_ms",
+				ServiceName: "query_instance_tag_service_ms",
+				Version:     "1.0.2",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		providerBlack = respCreateService.ServiceId
+
+		respAddRule, err := datasource.Instance().AddRule(getContext(), &pb.AddServiceRulesRequest{
+			ServiceId: providerBlack,
+			Rules: []*pb.AddOrUpdateServiceRule{
+				{
+					RuleType:  "BLACK",
+					Attribute: "Version",
+					Pattern:   "1.0.0",
+				},
+				{
+					RuleType:  "BLACK",
+					Attribute: "tag_a",
+					Pattern:   "b",
+				},
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respAddRule.Response.GetCode())
+
+		respCreateService, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "query_instance_tag_ms",
+				ServiceName: "query_instance_tag_service_ms",
+				Version:     "1.0.3",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		providerWhite = respCreateService.ServiceId
+
+		respAddRule, err = datasource.Instance().AddRule(getContext(), &pb.AddServiceRulesRequest{
+			ServiceId: providerWhite,
+			Rules: []*pb.AddOrUpdateServiceRule{
+				{
+					RuleType:  "WHITE",
+					Attribute: "Version",
+					Pattern:   "1.0.0",
+				},
+				{
+					RuleType:  "WHITE",
+					Attribute: "tag_a",
+					Pattern:   "b",
+				},
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respAddRule.Response.GetCode())
+
+		respCreateService, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "query_instance_tag_ms",
+				ServiceName: "query_instance_tag_consumer_ms",
+				Version:     "1.0.4",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respCreateService.Response.GetCode())
+		consumerTag = respCreateService.ServiceId
+
+		respAddTag, err := datasource.Instance().AddTags(getContext(), &pb.AddServiceTagsRequest{
+			ServiceId: consumerTag,
+			Tags:      map[string]string{"a": "b"},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respAddTag.Response.GetCode())
+	})
+
+	t.Run("when query instances", func(t *testing.T) {
+		log.Info("consumer version in black list")
+		resp, err := datasource.Instance().GetInstances(getContext(), &pb.GetInstancesRequest{
+			ConsumerServiceId: consumerVersion,
+			ProviderServiceId: providerBlack,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrServiceNotExists, resp.Response.GetCode())
+
+		log.Info("consumer tag in black list")
+		resp, err = datasource.Instance().GetInstances(getContext(), &pb.GetInstancesRequest{
+			ConsumerServiceId: consumerTag,
+			ProviderServiceId: providerBlack,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrServiceNotExists, resp.Response.GetCode())
+
+		log.Info("find should return 200 even if consumer permission deny")
+		respFind, err := datasource.Instance().FindInstances(getContext(), &pb.FindInstancesRequest{
+			ConsumerServiceId: consumerVersion,
+			AppId:             "query_instance_tag_ms",
+			ServiceName:       "query_instance_tag_service_ms",
+			VersionRule:       "0+",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respFind.Response.GetCode())
+		assert.Equal(t, 0, len(respFind.Instances))
+
+		respFind, err = datasource.Instance().FindInstances(getContext(), &pb.FindInstancesRequest{
+			ConsumerServiceId: consumerTag,
+			AppId:             "query_instance_tag_ms",
+			ServiceName:       "query_instance_tag_service_ms",
+			VersionRule:       "0+",
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, respFind.Response.GetCode())
+		assert.Equal(t, 0, len(respFind.Instances))
+
+		log.Info("consumer not in black list")
+		resp, err = datasource.Instance().GetInstances(getContext(), &pb.GetInstancesRequest{
+			ConsumerServiceId: providerWhite,
+			ProviderServiceId: providerBlack,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+		log.Info("consumer not in white list")
+		resp, err = datasource.Instance().GetInstances(getContext(), &pb.GetInstancesRequest{
+			ConsumerServiceId: providerBlack,
+			ProviderServiceId: providerWhite,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, scerr.ErrServiceNotExists, resp.Response.GetCode())
+
+		log.Info("consumer version in white list")
+		resp, err = datasource.Instance().GetInstances(getContext(), &pb.GetInstancesRequest{
+			ConsumerServiceId: consumerVersion,
+			ProviderServiceId: providerWhite,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+		log.Info("consumer tag in white list")
+		resp, err = datasource.Instance().GetInstances(getContext(), &pb.GetInstancesRequest{
+			ConsumerServiceId: consumerTag,
+			ProviderServiceId: providerWhite,
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+	})
+}
+
+func TestTags_Add(t *testing.T) {
 	var (
 		serviceId1 string
 		serviceId2 string
 	)
+
 	// init
 	datasource.Install("etcd", func(opts datasource.Options) (datasource.DataSource, error) {
 		return NewDataSource(opts), nil
@@ -2790,11 +3604,12 @@ func TestTag_Add(t *testing.T) {
 		PluginImplName: datasource.ImplName(archaius.GetString("servicecomb.datasource.name", "etcd")),
 	})
 	assert.NoError(t, err)
+
 	// create service
 	t.Run("create service", func(t *testing.T) {
 		svc1 := &pb.MicroService{
-			AppId:       "create_tag_group",
-			ServiceName: "create_tag_service",
+			AppId:       "create_tag_group_ms",
+			ServiceName: "create_tag_service_ms",
 			Version:     "1.0.0",
 			Level:       "FRONT",
 			Status:      pb.MS_UP,
@@ -2807,8 +3622,8 @@ func TestTag_Add(t *testing.T) {
 		serviceId1 = resp.ServiceId
 
 		svc2 := &pb.MicroService{
-			AppId:       "create_tag_group",
-			ServiceName: "create_tag_service",
+			AppId:       "create_tag_group_ms",
+			ServiceName: "create_tag_service_ms",
 			Version:     "1.0.1",
 			Level:       "FRONT",
 			Status:      pb.MS_UP,
diff --git a/datasource/ms.go b/datasource/ms.go
index 8f07e30..c7bd219 100644
--- a/datasource/ms.go
+++ b/datasource/ms.go
@@ -51,16 +51,17 @@ type MetadataManager interface {
 	ModifySchemas(ctx context.Context, request *pb.ModifySchemasRequest) (*pb.ModifySchemasResponse, error)
 	ModifySchema(ctx context.Context, request *pb.ModifySchemaRequest) (*pb.ModifySchemaResponse, error)
 	ExistSchema(ctx context.Context, request *pb.GetExistenceRequest) (*pb.GetExistenceResponse, error)
-	GetSchema()
-	DeleteSchema()
+	GetSchema(ctx context.Context, request *pb.GetSchemaRequest) (*pb.GetSchemaResponse, error)
+	GetAllSchemas(ctx context.Context, request *pb.GetAllSchemaRequest) (*pb.GetAllSchemaResponse, error)
+	DeleteSchema(ctx context.Context, request *pb.DeleteSchemaRequest) (*pb.DeleteSchemaResponse, error)
 
 	AddTags(ctx context.Context, in *pb.AddServiceTagsRequest) (*pb.AddServiceTagsResponse, error)
 	GetTag()
 	UpdateTag()
 	DeleteTag()
 
-	AddRule()
-	GetRule()
-	UpdateRule()
-	DeleteRule()
+	AddRule(ctx context.Context, request *pb.AddServiceRulesRequest) (*pb.AddServiceRulesResponse, error)
+	GetRule(ctx context.Context, request *pb.GetServiceRulesRequest) (*pb.GetServiceRulesResponse, error)
+	UpdateRule(ctx context.Context, request *pb.UpdateServiceRuleRequest) (*pb.UpdateServiceRuleResponse, error)
+	DeleteRule(ctx context.Context, request *pb.DeleteServiceRulesRequest) (*pb.DeleteServiceRulesResponse, error)
 }
diff --git a/scripts/ut_test_in_docker.sh b/scripts/ut_test_in_docker.sh
index 3dc640b..d480c60 100755
--- a/scripts/ut_test_in_docker.sh
+++ b/scripts/ut_test_in_docker.sh
@@ -40,6 +40,7 @@ echo "${green}Etcd is running......${reset}"
 echo "${green}Preparing the env for UT....${reset}"
 ./scripts/prepare_env_ut.sh
 
+[ $? == 0 ] && ut_for_dir datasource
 [ $? == 0 ] && ut_for_dir pkg
 [ $? == 0 ] && ut_for_dir server
 [ $? == 0 ] && ut_for_dir scctl