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 2021/08/19 13:49:58 UTC

[servicecomb-service-center] branch master updated: Get service/instance from cache (#1066) (#1077)

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 ed4512b  Get service/instance from cache (#1066) (#1077)
ed4512b is described below

commit ed4512ba9373cf6e7456d96dade707e328adbb7e
Author: fuziye01 <74...@users.noreply.github.com>
AuthorDate: Thu Aug 19 21:49:53 2021 +0800

    Get service/instance from cache (#1066) (#1077)
---
 datasource/cache/ms_cache.go                     | 170 +++++++++++---
 datasource/common.go                             |   1 +
 datasource/instance_test.go                      | 274 +++++++++++------------
 datasource/mongo/client/dao/dep.go               |   9 +-
 datasource/mongo/dep.go                          |  52 +----
 datasource/mongo/dep_util.go                     |  12 +-
 datasource/mongo/dependency_query.go             |  11 +-
 datasource/mongo/event/instance_event_handler.go |  19 +-
 datasource/mongo/instance_util.go                |  75 +++++++
 datasource/mongo/microservice_util.go            |  91 ++++++++
 datasource/mongo/ms.go                           | 218 ++++++++----------
 datasource/mongo/sd/instance_cache.go            |  11 +-
 datasource/mongo/sd/instancec_test.go            |  35 ++-
 datasource/mongo/sd/service_cache.go             |  13 +-
 datasource/mongo/sd/servicec_test.go             |  29 ++-
 datasource/mongo/util.go                         |  13 +-
 16 files changed, 639 insertions(+), 394 deletions(-)

diff --git a/datasource/cache/ms_cache.go b/datasource/cache/ms_cache.go
index 9c7cd8a..41a2bce 100644
--- a/datasource/cache/ms_cache.go
+++ b/datasource/cache/ms_cache.go
@@ -21,19 +21,15 @@ import (
 	"context"
 	"strings"
 
-	"github.com/go-chassis/cari/discovery"
-
+	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/sd"
 	"github.com/apache/servicecomb-service-center/pkg/util"
-)
-
-const (
-	Provider = "p"
+	"github.com/go-chassis/cari/discovery"
 )
 
 func GetProviderServiceOfDeps(provider *discovery.MicroService) (*discovery.MicroServiceDependency, bool) {
-	res := sd.Store().Dep().Cache().GetValue(genDepServiceKey(Provider, provider))
+	res := sd.Store().Dep().Cache().GetValue(genDepServiceKey(datasource.Provider, provider))
 	deps, ok := transCacheToDep(res)
 	if !ok {
 		return nil, false
@@ -60,48 +56,50 @@ func genDepServiceKey(ruleType string, service *discovery.MicroService) string {
 	return strings.Join([]string{ruleType, service.AppId, service.ServiceName, service.Version}, "/")
 }
 
-func GetMicroServiceInstancesByID(serviceID string) ([]*discovery.MicroServiceInstance, bool) {
-	cacheInstances := sd.Store().Instance().Cache().GetValue(serviceID)
-	insts, ok := transCacheToInsts(cacheInstances)
+func GetMicroServiceInstancesByID(ctx context.Context, serviceID string) ([]*discovery.MicroServiceInstance, bool) {
+	index := genServiceIDIndex(ctx, serviceID)
+	cacheInstances := sd.Store().Instance().Cache().GetValue(index)
+	insts, ok := transCacheToMicroInsts(cacheInstances)
 	if !ok {
 		return nil, false
 	}
 	return insts, true
 }
 
-func transCacheToInsts(cache []interface{}) ([]*discovery.MicroServiceInstance, bool) {
-	res := make([]*discovery.MicroServiceInstance, 0, len(cache))
-	for _, iter := range cache {
-		inst, ok := iter.(model.Instance)
-		if !ok {
-			return nil, false
-		}
-		res = append(res, inst.Instance)
+func GetServiceByID(ctx context.Context, serviceID string) (*model.Service, bool) {
+	if util.NoCache(ctx) {
+		return nil, false
 	}
-	if len(res) == 0 {
+	index := genServiceIDIndex(ctx, serviceID)
+	cacheRes := sd.Store().Service().Cache().GetValue(index)
+	if len(cacheRes) == 0 {
 		return nil, false
 	}
-	return res, true
+	res, ok := transCacheToService(cacheRes)
+	if !ok {
+		return nil, false
+	}
+	return res[0], true
 }
 
-func GetServiceByID(ctx context.Context, serviceID string) (*model.Service, bool) {
+func GetServiceByName(ctx context.Context, key *discovery.MicroServiceKey) ([]*model.Service, bool) {
 	if util.NoCache(ctx) {
 		return nil, false
 	}
-	cacheIndex := strings.Join([]string{util.ParseDomain(ctx), util.ParseProject(ctx), serviceID}, "/")
-	cacheRes := sd.Store().Service().Cache().GetValue(cacheIndex)
-	res, ok := transCacheToService(cacheRes)
+	cacheIndex := genServiceNameIndex(ctx, key)
+	res := sd.Store().Service().Cache().GetValue(cacheIndex)
+	cacheService, ok := transCacheToService(res)
 	if !ok {
 		return nil, false
 	}
-	return res[0], true
+	return cacheService, true
 }
 
 func GetServiceID(ctx context.Context, key *discovery.MicroServiceKey) (serviceID string, exist bool) {
 	if util.NoCache(ctx) {
 		return
 	}
-	cacheIndex := strings.Join([]string{util.ParseDomain(ctx), util.ParseProject(ctx), key.AppId, key.ServiceName, key.Version}, "/")
+	cacheIndex := genServiceKeyIndex(ctx, key)
 	res := sd.Store().Service().Cache().GetValue(cacheIndex)
 	cacheService, ok := transCacheToService(res)
 	if !ok {
@@ -110,6 +108,43 @@ func GetServiceID(ctx context.Context, key *discovery.MicroServiceKey) (serviceI
 	return cacheService[0].Service.ServiceId, true
 }
 
+func GetServiceByIDAcrossDomain(ctx context.Context, serviceID string) (*model.Service, bool) {
+	index := genServiceIDIndexAcrossDomain(ctx, serviceID)
+	cacheRes := sd.Store().Service().Cache().GetValue(index)
+
+	if len(cacheRes) == 0 {
+		return nil, false
+	}
+
+	res, ok := transCacheToService(cacheRes)
+	if !ok {
+		return nil, false
+	}
+
+	return res[0], true
+}
+
+func GetServicesByDomainProject(domainProject string) (service []*model.Service, exist bool) {
+	services := make([]*model.Service, 0)
+	sd.Store().Service().Cache().GetValue(domainProject)
+	if len(services) == 0 {
+		return services, false
+	}
+	return services, true
+}
+
+func GetMicroServicesByDomainProject(domainProject string) (service []*discovery.MicroService, exist bool) {
+	services, exist := GetServicesByDomainProject(domainProject)
+	if !exist || len(services) == 0 {
+		return nil, false
+	}
+	ms := make([]*discovery.MicroService, len(services))
+	for i, s := range services {
+		ms[i] = s.Service
+	}
+	return ms, true
+}
+
 func transCacheToService(services []interface{}) ([]*model.Service, bool) {
 	res := make([]*model.Service, 0, len(services))
 	for _, v := range services {
@@ -129,3 +164,86 @@ func transCacheToService(services []interface{}) ([]*model.Service, bool) {
 	}
 	return res, true
 }
+
+func genServiceIDIndexAcrossDomain(ctx context.Context, serviceID string) string {
+	return strings.Join([]string{util.ParseTargetDomainProject(ctx), serviceID}, datasource.SPLIT)
+}
+
+func genServiceIDIndex(ctx context.Context, serviceID string) string {
+	return strings.Join([]string{util.ParseDomainProject(ctx), serviceID}, datasource.SPLIT)
+}
+
+func genServiceKeyIndex(ctx context.Context, key *discovery.MicroServiceKey) string {
+	return strings.Join([]string{util.ParseDomain(ctx), util.ParseProject(ctx), key.AppId, key.ServiceName, key.Version}, datasource.SPLIT)
+}
+
+func genServiceNameIndex(ctx context.Context, key *discovery.MicroServiceKey) string {
+	return strings.Join([]string{util.ParseDomain(ctx), util.ParseProject(ctx), key.AppId, key.ServiceName}, datasource.SPLIT)
+}
+
+func CountInstances(ctx context.Context, serviceID string) (int, bool) {
+	index := genServiceIDIndex(ctx, serviceID)
+	cacheInstances := sd.Store().Instance().Cache().GetValue(index)
+	if len(cacheInstances) == 0 {
+		return 0, false
+	}
+	return len(cacheInstances), true
+}
+
+func GetInstance(ctx context.Context, serviceID string, instanceID string) (*model.Instance, bool) {
+	index := generateInstanceIDIndex(util.ParseDomainProject(ctx), serviceID, instanceID)
+	cacheInstance := sd.Store().Instance().Cache().GetValue(index)
+	insts, ok := transCacheToInsts(cacheInstance)
+	if !ok {
+		return nil, false
+	}
+	return insts[0], true
+}
+
+func GetInstances(ctx context.Context) ([]*model.Instance, bool) {
+	index := util.ParseDomainProject(ctx)
+	cacheInstance := sd.Store().Instance().Cache().GetValue(index)
+	insts, ok := transCacheToInsts(cacheInstance)
+	if !ok {
+		return nil, false
+	}
+	return insts, true
+}
+
+func transCacheToMicroInsts(cache []interface{}) ([]*discovery.MicroServiceInstance, bool) {
+	res := make([]*discovery.MicroServiceInstance, 0, len(cache))
+	for _, iter := range cache {
+		inst, ok := iter.(model.Instance)
+		if !ok {
+			return nil, false
+		}
+		res = append(res, inst.Instance)
+	}
+	if len(res) == 0 {
+		return nil, false
+	}
+	return res, true
+}
+
+func transCacheToInsts(cache []interface{}) ([]*model.Instance, bool) {
+	res := make([]*model.Instance, 0, len(cache))
+	for _, iter := range cache {
+		inst, ok := iter.(model.Instance)
+		if !ok {
+			return nil, false
+		}
+		res = append(res, &inst)
+	}
+	if len(res) == 0 {
+		return nil, false
+	}
+	return res, true
+}
+
+func generateInstanceIDIndex(domainProject string, serviceID string, instanceID string) string {
+	return util.StringJoin([]string{
+		domainProject,
+		serviceID,
+		instanceID,
+	}, datasource.SPLIT)
+}
diff --git a/datasource/common.go b/datasource/common.go
index c896076..22b8b54 100644
--- a/datasource/common.go
+++ b/datasource/common.go
@@ -30,6 +30,7 @@ const (
 	RegistryProject       = "default"
 	RegistryDomainProject = "default/default"
 	RegistryAppID         = "default"
+	Provider              = "p"
 )
 
 // WrapErrResponse is temp func here to wait finish to refact the discosvc pkg
diff --git a/datasource/instance_test.go b/datasource/instance_test.go
index 291e908..29ce7af 100644
--- a/datasource/instance_test.go
+++ b/datasource/instance_test.go
@@ -33,7 +33,7 @@ import (
 )
 
 func TestInstance_Create(t *testing.T) {
-	var serviceId string
+	var serviceID string
 
 	t.Run("create service", func(t *testing.T) {
 		respCreateService, err := datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
@@ -48,13 +48,13 @@ func TestInstance_Create(t *testing.T) {
 
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId = respCreateService.ServiceId
+		serviceID = respCreateService.ServiceId
 	})
 
 	t.Run("register instance", func(t *testing.T) {
 		respCreateInst, err := datasource.GetMetadataManager().RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 			Instance: &pb.MicroServiceInstance{
-				ServiceId: serviceId,
+				ServiceId: serviceID,
 				Endpoints: []string{
 					"createInstance_ms:127.0.0.1:8080",
 				},
@@ -69,7 +69,7 @@ func TestInstance_Create(t *testing.T) {
 		respCreateInst, err = datasource.GetMetadataManager().RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 			Instance: &pb.MicroServiceInstance{
 				InstanceId: "customId_ms",
-				ServiceId:  serviceId,
+				ServiceId:  serviceID,
 				Endpoints: []string{
 					"createInstance_ms:127.0.0.1:8080",
 				},
@@ -84,7 +84,7 @@ func TestInstance_Create(t *testing.T) {
 
 	t.Run("update the same instance", func(t *testing.T) {
 		instance := &pb.MicroServiceInstance{
-			ServiceId: serviceId,
+			ServiceId: serviceID,
 			Endpoints: []string{
 				"sameInstance:127.0.0.1:8080",
 			},
@@ -108,9 +108,9 @@ func TestInstance_Create(t *testing.T) {
 
 func TestInstance_HeartBeat(t *testing.T) {
 	var (
-		serviceId   string
-		instanceId1 string
-		instanceId2 string
+		serviceID   string
+		instanceID1 string
+		instanceID2 string
 	)
 
 	t.Run("register service and instance, should pass", func(t *testing.T) {
@@ -126,11 +126,11 @@ func TestInstance_HeartBeat(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId = respCreateService.ServiceId
+		serviceID = respCreateService.ServiceId
 
 		respCreateInstance, err := datasource.GetMetadataManager().RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 			Instance: &pb.MicroServiceInstance{
-				ServiceId: serviceId,
+				ServiceId: serviceID,
 				HostName:  "UT-HOST-MS",
 				Endpoints: []string{
 					"heartbeat:127.0.0.1:8080",
@@ -140,11 +140,11 @@ func TestInstance_HeartBeat(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
-		instanceId1 = respCreateInstance.InstanceId
+		instanceID1 = respCreateInstance.InstanceId
 
 		respCreateInstance, err = datasource.GetMetadataManager().RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 			Instance: &pb.MicroServiceInstance{
-				ServiceId: serviceId,
+				ServiceId: serviceID,
 				HostName:  "UT-HOST-MS",
 				Endpoints: []string{
 					"heartbeat:127.0.0.2:8080",
@@ -154,14 +154,14 @@ func TestInstance_HeartBeat(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
-		instanceId2 = respCreateInstance.InstanceId
+		instanceID2 = respCreateInstance.InstanceId
 	})
 
 	t.Run("update a lease", func(t *testing.T) {
 		log.Info("valid instance")
 		resp, err := datasource.GetMetadataManager().Heartbeat(getContext(), &pb.HeartbeatRequest{
-			ServiceId:  serviceId,
-			InstanceId: instanceId1,
+			ServiceId:  serviceID,
+			InstanceId: instanceID1,
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
@@ -169,14 +169,14 @@ func TestInstance_HeartBeat(t *testing.T) {
 		log.Info("serviceId does not exist")
 		resp, err = datasource.GetMetadataManager().Heartbeat(getContext(), &pb.HeartbeatRequest{
 			ServiceId:  "100000000000",
-			InstanceId: instanceId1,
+			InstanceId: instanceID1,
 		})
 		assert.NoError(t, err)
 		assert.NotEqual(t, pb.ResponseSuccess, resp.Response.GetCode())
 
 		log.Info("instance does not exist")
 		resp, err = datasource.GetMetadataManager().Heartbeat(getContext(), &pb.HeartbeatRequest{
-			ServiceId:  serviceId,
+			ServiceId:  serviceID,
 			InstanceId: "not-exist-ins",
 		})
 		assert.NoError(t, err)
@@ -188,12 +188,12 @@ func TestInstance_HeartBeat(t *testing.T) {
 		resp, err := datasource.GetMetadataManager().HeartbeatSet(getContext(), &pb.HeartbeatSetRequest{
 			Instances: []*pb.HeartbeatSetElement{
 				{
-					ServiceId:  serviceId,
-					InstanceId: instanceId1,
+					ServiceId:  serviceID,
+					InstanceId: instanceID1,
 				},
 				{
-					ServiceId:  serviceId,
-					InstanceId: instanceId2,
+					ServiceId:  serviceID,
+					InstanceId: instanceID2,
 				},
 			},
 		})
@@ -204,8 +204,8 @@ func TestInstance_HeartBeat(t *testing.T) {
 
 func TestInstance_Update(t *testing.T) {
 	var (
-		serviceId  string
-		instanceId string
+		serviceID  string
+		instanceID string
 	)
 
 	t.Run("register service and instance, should pass", func(t *testing.T) {
@@ -221,12 +221,12 @@ func TestInstance_Update(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId = respCreateService.ServiceId
+		serviceID = respCreateService.ServiceId
 
 		log.Info("create instance")
 		respCreateInstance, err := datasource.GetMetadataManager().RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 			Instance: &pb.MicroServiceInstance{
-				ServiceId: serviceId,
+				ServiceId: serviceID,
 				Endpoints: []string{
 					"updateInstance:127.0.0.1:8080",
 				},
@@ -237,14 +237,14 @@ func TestInstance_Update(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
-		instanceId = respCreateInstance.InstanceId
+		instanceID = respCreateInstance.InstanceId
 	})
 
 	t.Run("update instance status", func(t *testing.T) {
 		log.Info("update instance status to DOWN")
 		respUpdateStatus, err := datasource.GetMetadataManager().UpdateInstanceStatus(getContext(), &pb.UpdateInstanceStatusRequest{
-			ServiceId:  serviceId,
-			InstanceId: instanceId,
+			ServiceId:  serviceID,
+			InstanceId: instanceID,
 			Status:     pb.MSI_DOWN,
 		})
 		assert.NoError(t, err)
@@ -252,8 +252,8 @@ func TestInstance_Update(t *testing.T) {
 
 		log.Info("update instance status to OUTOFSERVICE")
 		respUpdateStatus, err = datasource.GetMetadataManager().UpdateInstanceStatus(getContext(), &pb.UpdateInstanceStatusRequest{
-			ServiceId:  serviceId,
-			InstanceId: instanceId,
+			ServiceId:  serviceID,
+			InstanceId: instanceID,
 			Status:     pb.MSI_OUTOFSERVICE,
 		})
 		assert.NoError(t, err)
@@ -261,8 +261,8 @@ func TestInstance_Update(t *testing.T) {
 
 		log.Info("update instance status to STARTING")
 		respUpdateStatus, err = datasource.GetMetadataManager().UpdateInstanceStatus(getContext(), &pb.UpdateInstanceStatusRequest{
-			ServiceId:  serviceId,
-			InstanceId: instanceId,
+			ServiceId:  serviceID,
+			InstanceId: instanceID,
 			Status:     pb.MSI_STARTING,
 		})
 		assert.NoError(t, err)
@@ -270,8 +270,8 @@ func TestInstance_Update(t *testing.T) {
 
 		log.Info("update instance status to TESTING")
 		respUpdateStatus, err = datasource.GetMetadataManager().UpdateInstanceStatus(getContext(), &pb.UpdateInstanceStatusRequest{
-			ServiceId:  serviceId,
-			InstanceId: instanceId,
+			ServiceId:  serviceID,
+			InstanceId: instanceID,
 			Status:     pb.MSI_TESTING,
 		})
 		assert.NoError(t, err)
@@ -279,8 +279,8 @@ func TestInstance_Update(t *testing.T) {
 
 		log.Info("update instance status to UP")
 		respUpdateStatus, err = datasource.GetMetadataManager().UpdateInstanceStatus(getContext(), &pb.UpdateInstanceStatusRequest{
-			ServiceId:  serviceId,
-			InstanceId: instanceId,
+			ServiceId:  serviceID,
+			InstanceId: instanceID,
 			Status:     pb.MSI_UP,
 		})
 		assert.NoError(t, err)
@@ -288,7 +288,7 @@ func TestInstance_Update(t *testing.T) {
 
 		log.Info("update instance status with a not exist instance")
 		respUpdateStatus, err = datasource.GetMetadataManager().UpdateInstanceStatus(getContext(), &pb.UpdateInstanceStatusRequest{
-			ServiceId:  serviceId,
+			ServiceId:  serviceID,
 			InstanceId: "notexistins",
 			Status:     pb.MSI_STARTING,
 		})
@@ -300,8 +300,8 @@ func TestInstance_Update(t *testing.T) {
 		log.Info("update one properties")
 		respUpdateProperties, err := datasource.GetMetadataManager().UpdateInstanceProperties(getContext(),
 			&pb.UpdateInstancePropsRequest{
-				ServiceId:  serviceId,
-				InstanceId: instanceId,
+				ServiceId:  serviceID,
+				InstanceId: instanceID,
 				Properties: map[string]string{
 					"test": "test",
 				},
@@ -318,8 +318,8 @@ func TestInstance_Update(t *testing.T) {
 		}
 		respUpdateProperties, err = datasource.GetMetadataManager().UpdateInstanceProperties(getContext(),
 			&pb.UpdateInstancePropsRequest{
-				ServiceId:  serviceId,
-				InstanceId: instanceId,
+				ServiceId:  serviceID,
+				InstanceId: instanceID,
 				Properties: properties,
 			})
 		assert.NoError(t, err)
@@ -328,7 +328,7 @@ func TestInstance_Update(t *testing.T) {
 		log.Info("update instance that does not exist")
 		respUpdateProperties, err = datasource.GetMetadataManager().UpdateInstanceProperties(getContext(),
 			&pb.UpdateInstancePropsRequest{
-				ServiceId:  serviceId,
+				ServiceId:  serviceID,
 				InstanceId: "not_exist_ins",
 				Properties: map[string]string{
 					"test": "test",
@@ -340,8 +340,8 @@ func TestInstance_Update(t *testing.T) {
 		log.Info("remove properties")
 		respUpdateProperties, err = datasource.GetMetadataManager().UpdateInstanceProperties(getContext(),
 			&pb.UpdateInstancePropsRequest{
-				ServiceId:  serviceId,
-				InstanceId: instanceId,
+				ServiceId:  serviceID,
+				InstanceId: instanceID,
 			})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respUpdateProperties.Response.GetCode())
@@ -350,7 +350,7 @@ func TestInstance_Update(t *testing.T) {
 		respUpdateProperties, err = datasource.GetMetadataManager().UpdateInstanceProperties(getContext(),
 			&pb.UpdateInstancePropsRequest{
 				ServiceId:  "not_exist_service",
-				InstanceId: instanceId,
+				InstanceId: instanceID,
 				Properties: map[string]string{
 					"test": "test",
 				},
@@ -362,21 +362,21 @@ func TestInstance_Update(t *testing.T) {
 
 func TestInstance_Query(t *testing.T) {
 	var (
-		serviceId1  string
-		serviceId2  string
-		serviceId3  string
-		serviceId4  string
-		serviceId5  string
-		serviceId6  string
-		serviceId7  string
-		serviceId8  string
-		serviceId9  string
-		instanceId1 string
-		instanceId2 string
-		instanceId4 string
-		instanceId5 string
-		instanceId8 string
-		instanceId9 string
+		serviceID1  string
+		serviceID2  string
+		serviceID3  string
+		serviceID4  string
+		serviceID5  string
+		serviceID6  string
+		serviceID7  string
+		serviceID8  string
+		serviceID9  string
+		instanceID1 string
+		instanceID2 string
+		instanceID4 string
+		instanceID5 string
+		instanceID8 string
+		instanceID9 string
 	)
 
 	t.Run("register services and instances for testInstance_query", func(t *testing.T) {
@@ -391,7 +391,7 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId1 = respCreateService.ServiceId
+		serviceID1 = respCreateService.ServiceId
 
 		respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
@@ -404,7 +404,7 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId2 = respCreateService.ServiceId
+		serviceID2 = respCreateService.ServiceId
 
 		respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
@@ -417,7 +417,7 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId3 = respCreateService.ServiceId
+		serviceID3 = respCreateService.ServiceId
 
 		respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
@@ -431,7 +431,7 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId4 = respCreateService.ServiceId
+		serviceID4 = respCreateService.ServiceId
 
 		respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
@@ -448,7 +448,7 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId5 = respCreateService.ServiceId
+		serviceID5 = respCreateService.ServiceId
 
 		respCreateService, err = datasource.GetMetadataManager().RegisterService(
 			util.SetDomainProject(util.CloneContext(getContext()), "user", "user"),
@@ -463,7 +463,7 @@ func TestInstance_Query(t *testing.T) {
 			})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId6 = respCreateService.ServiceId
+		serviceID6 = respCreateService.ServiceId
 
 		respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
@@ -476,7 +476,7 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId7 = respCreateService.ServiceId
+		serviceID7 = respCreateService.ServiceId
 
 		respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
@@ -489,7 +489,7 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId8 = respCreateService.ServiceId
+		serviceID8 = respCreateService.ServiceId
 
 		respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
@@ -502,11 +502,11 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
-		serviceId9 = respCreateService.ServiceId
+		serviceID9 = respCreateService.ServiceId
 
 		respCreateInstance, err := datasource.GetMetadataManager().RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 			Instance: &pb.MicroServiceInstance{
-				ServiceId: serviceId1,
+				ServiceId: serviceID1,
 				HostName:  "UT-HOST-MS",
 				Endpoints: []string{
 					"find:127.0.0.1:8080",
@@ -516,11 +516,11 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
-		instanceId1 = respCreateInstance.InstanceId
+		instanceID1 = respCreateInstance.InstanceId
 
 		respCreateInstance, err = datasource.GetMetadataManager().RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 			Instance: &pb.MicroServiceInstance{
-				ServiceId: serviceId2,
+				ServiceId: serviceID2,
 				HostName:  "UT-HOST-MS",
 				Endpoints: []string{
 					"find:127.0.0.2:8080",
@@ -530,11 +530,11 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
-		instanceId2 = respCreateInstance.InstanceId
+		instanceID2 = respCreateInstance.InstanceId
 
 		respCreateInstance, err = datasource.GetMetadataManager().RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 			Instance: &pb.MicroServiceInstance{
-				ServiceId: serviceId4,
+				ServiceId: serviceID4,
 				HostName:  "UT-HOST-MS",
 				Endpoints: []string{
 					"find:127.0.0.4:8080",
@@ -544,11 +544,11 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
-		instanceId4 = respCreateInstance.InstanceId
+		instanceID4 = respCreateInstance.InstanceId
 
 		respCreateInstance, err = datasource.GetMetadataManager().RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 			Instance: &pb.MicroServiceInstance{
-				ServiceId: serviceId5,
+				ServiceId: serviceID5,
 				HostName:  "UT-HOST-MS",
 				Endpoints: []string{
 					"find:127.0.0.5:8080",
@@ -558,11 +558,11 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
-		instanceId5 = respCreateInstance.InstanceId
+		instanceID5 = respCreateInstance.InstanceId
 
 		respCreateInstance, err = datasource.GetMetadataManager().RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 			Instance: &pb.MicroServiceInstance{
-				ServiceId: serviceId8,
+				ServiceId: serviceID8,
 				HostName:  "UT-HOST-MS",
 				Endpoints: []string{
 					"find:127.0.0.8:8080",
@@ -572,11 +572,11 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
-		instanceId8 = respCreateInstance.InstanceId
+		instanceID8 = respCreateInstance.InstanceId
 
 		respCreateInstance, err = datasource.GetMetadataManager().RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 			Instance: &pb.MicroServiceInstance{
-				ServiceId: serviceId9,
+				ServiceId: serviceID9,
 				HostName:  "UT-HOST-MS",
 				Endpoints: []string{
 					"find:127.0.0.9:8080",
@@ -586,24 +586,24 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
-		instanceId9 = respCreateInstance.InstanceId
+		instanceID9 = respCreateInstance.InstanceId
 	})
 
 	t.Run("query instance, should ok", func(t *testing.T) {
 		respFind, err := datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
-			ConsumerServiceId: serviceId1,
+			ConsumerServiceId: serviceID1,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_service_ms",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
-		assertInstancesContain(t, respFind.Instances, instanceId1)
-		assertInstancesContain(t, respFind.Instances, instanceId2)
+		assertInstancesContain(t, respFind.Instances, instanceID1)
+		assertInstancesContain(t, respFind.Instances, instanceID2)
 	})
 
 	t.Run("query not exist service instance, should failed", func(t *testing.T) {
 		respFind, err := datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
-			ConsumerServiceId: serviceId1,
+			ConsumerServiceId: serviceID1,
 			AppId:             "query_instance_ms",
 			ServiceName:       "not-exist",
 		})
@@ -613,14 +613,14 @@ func TestInstance_Query(t *testing.T) {
 
 	t.Run("query instance when with consumerID or specify env without consumerID, should ok", func(t *testing.T) {
 		respFind, err := datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
-			ConsumerServiceId: serviceId4,
+			ConsumerServiceId: serviceID4,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_diff_env_service_ms",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 1, len(respFind.Instances))
-		assertInstancesContain(t, respFind.Instances, instanceId4)
+		assertInstancesContain(t, respFind.Instances, instanceID4)
 
 		respFind, err = datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
 			Environment: pb.ENV_PROD,
@@ -630,13 +630,13 @@ func TestInstance_Query(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 1, len(respFind.Instances))
-		assertInstancesContain(t, respFind.Instances, instanceId4)
+		assertInstancesContain(t, respFind.Instances, instanceID4)
 	})
 
 	t.Run("query instance with revision, should ok", func(t *testing.T) {
 		ctx := util.SetContext(getContext(), util.CtxNocache, "")
 		respFind, err := datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
-			ConsumerServiceId: serviceId8,
+			ConsumerServiceId: serviceID8,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_with_rev_ms",
 		})
@@ -644,23 +644,23 @@ func TestInstance_Query(t *testing.T) {
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		rev, _ := ctx.Value(util.CtxResponseRevision).(string)
 		assert.NotEqual(t, 0, len(rev))
-		assertInstancesContain(t, respFind.Instances, instanceId8)
+		assertInstancesContain(t, respFind.Instances, instanceID8)
 
 		util.WithRequestRev(ctx, "x")
 		respFind, err = datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
-			ConsumerServiceId: serviceId8,
+			ConsumerServiceId: serviceID8,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_with_rev_ms",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, ctx.Value(util.CtxResponseRevision), rev)
-		assertInstancesContain(t, respFind.Instances, instanceId8)
+		assertInstancesContain(t, respFind.Instances, instanceID8)
 	})
 
 	t.Run("find should return 200 if consumer is diff apps, should ok", func(t *testing.T) {
 		respFind, err := datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
-			ConsumerServiceId: serviceId3,
+			ConsumerServiceId: serviceID3,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_service_ms",
 		})
@@ -671,7 +671,7 @@ func TestInstance_Query(t *testing.T) {
 
 	t.Run("find provider instance but specify tag does not exist, should ok", func(t *testing.T) {
 		respFind, err := datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
-			ConsumerServiceId: serviceId1,
+			ConsumerServiceId: serviceID1,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_service_ms",
 			Tags:              []string{"not_exist_tag"},
@@ -690,24 +690,24 @@ func TestInstance_Query(t *testing.T) {
 				util.SetDomainProject(util.CloneContext(getContext()), "user", "user"),
 				"default", "default"),
 			&pb.FindInstancesRequest{
-				ConsumerServiceId: serviceId6,
+				ConsumerServiceId: serviceID6,
 				AppId:             "default",
 				ServiceName:       "query_instance_shared_provider_ms",
 			})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 1, len(respFind.Instances))
-		assertInstancesContain(t, respFind.Instances, instanceId5)
+		assertInstancesContain(t, respFind.Instances, instanceID5)
 
 		respFind, err = datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
-			ConsumerServiceId: serviceId7,
+			ConsumerServiceId: serviceID7,
 			AppId:             "default",
 			ServiceName:       "query_instance_shared_provider_ms",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 1, len(respFind.Instances))
-		assertInstancesContain(t, respFind.Instances, instanceId5)
+		assertInstancesContain(t, respFind.Instances, instanceID5)
 
 		log.Info("query same domain deps")
 		// todo finish ut after implementing GetConsumerDependencies interface
@@ -717,7 +717,7 @@ func TestInstance_Query(t *testing.T) {
 
 	t.Run("batch query instances, should ok", func(t *testing.T) {
 		respFind, err := datasource.GetMetadataManager().BatchFind(getContext(), &pb.BatchFindInstancesRequest{
-			ConsumerServiceId: serviceId1,
+			ConsumerServiceId: serviceID1,
 			Services: []*pb.FindService{
 				{
 					Service: &pb.MicroServiceKey{
@@ -747,8 +747,8 @@ func TestInstance_Query(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, int64(0), respFind.Services.Updated[0].Index)
-		assertInstancesContain(t, respFind.Services.Updated[0].Instances, instanceId1)
-		assertInstancesContain(t, respFind.Services.Updated[0].Instances, instanceId2)
+		assertInstancesContain(t, respFind.Services.Updated[0].Instances, instanceID1)
+		assertInstancesContain(t, respFind.Services.Updated[0].Instances, instanceID2)
 		assert.Equal(t, int64(2), respFind.Services.Updated[1].Index)
 		assert.Empty(t, respFind.Services.Updated[1].Instances)
 		assert.Equal(t, 2, len(respFind.Services.Failed[0].Indexes))
@@ -757,7 +757,7 @@ func TestInstance_Query(t *testing.T) {
 
 	t.Run("batch query instances without specify env, should ok", func(t *testing.T) {
 		respFind, err := datasource.GetMetadataManager().BatchFind(getContext(), &pb.BatchFindInstancesRequest{
-			ConsumerServiceId: serviceId4,
+			ConsumerServiceId: serviceID4,
 			Services: []*pb.FindService{
 				{
 					Service: &pb.MicroServiceKey{
@@ -770,13 +770,13 @@ func TestInstance_Query(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 1, len(respFind.Services.Updated[0].Instances))
-		assert.Equal(t, instanceId4, respFind.Services.Updated[0].Instances[0].InstanceId)
+		assert.Equal(t, instanceID4, respFind.Services.Updated[0].Instances[0].InstanceId)
 	})
 
 	t.Run("batch query instances with revision, should ok", func(t *testing.T) {
 		ctx := util.SetContext(getContext(), util.CtxNocache, "")
 		respFind, err := datasource.GetMetadataManager().BatchFind(ctx, &pb.BatchFindInstancesRequest{
-			ConsumerServiceId: serviceId8,
+			ConsumerServiceId: serviceID8,
 			Services: []*pb.FindService{
 				{
 					Service: &pb.MicroServiceKey{
@@ -794,14 +794,14 @@ func TestInstance_Query(t *testing.T) {
 			Instances: []*pb.FindInstance{
 				{
 					Instance: &pb.HeartbeatSetElement{
-						ServiceId:  serviceId9,
-						InstanceId: instanceId9,
+						ServiceId:  serviceID9,
+						InstanceId: instanceID9,
 					},
 				},
 				{
 					Instance: &pb.HeartbeatSetElement{
-						ServiceId:  serviceId8,
-						InstanceId: instanceId8,
+						ServiceId:  serviceID8,
+						InstanceId: instanceID8,
 					},
 				},
 			},
@@ -811,18 +811,18 @@ func TestInstance_Query(t *testing.T) {
 		rev := respFind.Services.Updated[0].Rev
 		assert.Equal(t, int64(0), respFind.Services.Updated[0].Index)
 		assert.Equal(t, int64(1), respFind.Services.Updated[1].Index)
-		assert.Equal(t, instanceId8, respFind.Services.Updated[0].Instances[0].InstanceId)
-		assert.Equal(t, instanceId9, respFind.Services.Updated[1].Instances[0].InstanceId)
+		assert.Equal(t, instanceID8, respFind.Services.Updated[0].Instances[0].InstanceId)
+		assert.Equal(t, instanceID9, respFind.Services.Updated[1].Instances[0].InstanceId)
 		assert.NotEqual(t, 0, len(rev))
 		instanceRev := respFind.Instances.Updated[0].Rev
 		assert.Equal(t, int64(0), respFind.Instances.Updated[0].Index)
 		assert.Equal(t, int64(1), respFind.Instances.Updated[1].Index)
-		assert.Equal(t, instanceId9, respFind.Instances.Updated[0].Instances[0].InstanceId)
-		assert.Equal(t, instanceId8, respFind.Instances.Updated[1].Instances[0].InstanceId)
+		assert.Equal(t, instanceID9, respFind.Instances.Updated[0].Instances[0].InstanceId)
+		assert.Equal(t, instanceID8, respFind.Instances.Updated[1].Instances[0].InstanceId)
 		assert.NotEqual(t, 0, len(instanceRev))
 
 		respFind, err = datasource.GetMetadataManager().BatchFind(ctx, &pb.BatchFindInstancesRequest{
-			ConsumerServiceId: serviceId8,
+			ConsumerServiceId: serviceID8,
 			Services: []*pb.FindService{
 				{
 					Service: &pb.MicroServiceKey{
@@ -835,8 +835,8 @@ func TestInstance_Query(t *testing.T) {
 			Instances: []*pb.FindInstance{
 				{
 					Instance: &pb.HeartbeatSetElement{
-						ServiceId:  serviceId9,
-						InstanceId: instanceId9,
+						ServiceId:  serviceID9,
+						InstanceId: instanceID9,
 					},
 					Rev: "x",
 				},
@@ -844,13 +844,13 @@ func TestInstance_Query(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
-		assert.Equal(t, instanceId8, respFind.Services.Updated[0].Instances[0].InstanceId)
+		assert.Equal(t, instanceID8, respFind.Services.Updated[0].Instances[0].InstanceId)
 		assert.Equal(t, respFind.Services.Updated[0].Rev, rev)
-		assert.Equal(t, instanceId9, respFind.Instances.Updated[0].Instances[0].InstanceId)
+		assert.Equal(t, instanceID9, respFind.Instances.Updated[0].Instances[0].InstanceId)
 		assert.Equal(t, instanceRev, respFind.Instances.Updated[0].Rev)
 
 		respFind, err = datasource.GetMetadataManager().BatchFind(ctx, &pb.BatchFindInstancesRequest{
-			ConsumerServiceId: serviceId8,
+			ConsumerServiceId: serviceID8,
 			Services: []*pb.FindService{
 				{
 					Service: &pb.MicroServiceKey{
@@ -863,8 +863,8 @@ func TestInstance_Query(t *testing.T) {
 			Instances: []*pb.FindInstance{
 				{
 					Instance: &pb.HeartbeatSetElement{
-						ServiceId:  serviceId9,
-						InstanceId: instanceId9,
+						ServiceId:  serviceID9,
+						InstanceId: instanceID9,
 					},
 					Rev: instanceRev,
 				},
@@ -878,7 +878,7 @@ func TestInstance_Query(t *testing.T) {
 
 	t.Run("find should return 200 even if consumer is diff apps, should ok", func(t *testing.T) {
 		respFind, err := datasource.GetMetadataManager().BatchFind(getContext(), &pb.BatchFindInstancesRequest{
-			ConsumerServiceId: serviceId3,
+			ConsumerServiceId: serviceID3,
 			Services: []*pb.FindService{
 				{
 					Service: &pb.MicroServiceKey{
@@ -903,7 +903,7 @@ func TestInstance_Query(t *testing.T) {
 				util.SetDomainProject(util.CloneContext(getContext()), "user", "user"),
 				"default", "default"),
 			&pb.BatchFindInstancesRequest{
-				ConsumerServiceId: serviceId6,
+				ConsumerServiceId: serviceID6,
 				Services: []*pb.FindService{
 					{
 						Service: &pb.MicroServiceKey{
@@ -916,10 +916,10 @@ func TestInstance_Query(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 1, len(respFind.Services.Updated[0].Instances))
-		assert.Equal(t, instanceId5, respFind.Services.Updated[0].Instances[0].InstanceId)
+		assert.Equal(t, instanceID5, respFind.Services.Updated[0].Instances[0].InstanceId)
 
 		respFind, err = datasource.GetMetadataManager().BatchFind(getContext(), &pb.BatchFindInstancesRequest{
-			ConsumerServiceId: serviceId7,
+			ConsumerServiceId: serviceID7,
 			Services: []*pb.FindService{
 				{
 					Service: &pb.MicroServiceKey{
@@ -932,18 +932,18 @@ func TestInstance_Query(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 1, len(respFind.Services.Updated[0].Instances))
-		assert.Equal(t, instanceId5, respFind.Services.Updated[0].Instances[0].InstanceId)
+		assert.Equal(t, instanceID5, respFind.Services.Updated[0].Instances[0].InstanceId)
 
 		respFind, err = datasource.GetMetadataManager().BatchFind(util.SetTargetDomainProject(
 			util.SetDomainProject(util.CloneContext(getContext()), "user", "user"),
 			"default", "default"),
 			&pb.BatchFindInstancesRequest{
-				ConsumerServiceId: serviceId6,
+				ConsumerServiceId: serviceID6,
 				Instances: []*pb.FindInstance{
 					{
 						Instance: &pb.HeartbeatSetElement{
-							ServiceId:  serviceId5,
-							InstanceId: instanceId5,
+							ServiceId:  serviceID5,
+							InstanceId: instanceID5,
 						},
 					},
 				},
@@ -953,12 +953,12 @@ func TestInstance_Query(t *testing.T) {
 		assert.Equal(t, pb.ErrServiceNotExists, respFind.Instances.Failed[0].Error.Code)
 
 		respFind, err = datasource.GetMetadataManager().BatchFind(getContext(), &pb.BatchFindInstancesRequest{
-			ConsumerServiceId: serviceId7,
+			ConsumerServiceId: serviceID7,
 			Instances: []*pb.FindInstance{
 				{
 					Instance: &pb.HeartbeatSetElement{
-						ServiceId:  serviceId5,
-						InstanceId: instanceId5,
+						ServiceId:  serviceID5,
+						InstanceId: instanceID5,
 					},
 				},
 			},
@@ -966,7 +966,7 @@ func TestInstance_Query(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 1, len(respFind.Instances.Updated[0].Instances))
-		assert.Equal(t, instanceId5, respFind.Instances.Updated[0].Instances[0].InstanceId)
+		assert.Equal(t, instanceID5, respFind.Instances.Updated[0].Instances[0].InstanceId)
 
 		core.Service.Environment = pb.ENV_DEV
 	})
@@ -976,20 +976,20 @@ func TestInstance_Query(t *testing.T) {
 		UTFunc := func(consumerId string, code int32) {
 			respFind, err := datasource.GetMetadataManager().GetInstances(getContext(), &pb.GetInstancesRequest{
 				ConsumerServiceId: consumerId,
-				ProviderServiceId: serviceId2,
+				ProviderServiceId: serviceID2,
 			})
 			assert.NoError(t, err)
 			assert.Equal(t, code, respFind.Response.GetCode())
 		}
 
-		UTFunc(serviceId3, pb.ErrServiceNotExists)
+		UTFunc(serviceID3, pb.ErrServiceNotExists)
 
-		UTFunc(serviceId1, pb.ResponseSuccess)
+		UTFunc(serviceID1, pb.ResponseSuccess)
 
 		log.Info("diff env")
 		respFind, err := datasource.GetMetadataManager().GetInstances(getContext(), &pb.GetInstancesRequest{
-			ConsumerServiceId: serviceId4,
-			ProviderServiceId: serviceId2,
+			ConsumerServiceId: serviceID4,
+			ProviderServiceId: serviceID2,
 		})
 		assert.NoError(t, err)
 		assert.NotEqual(t, pb.ResponseSuccess, respFind.Response.GetCode())
diff --git a/datasource/mongo/client/dao/dep.go b/datasource/mongo/client/dao/dep.go
index b0d2df9..2e319f0 100644
--- a/datasource/mongo/client/dao/dep.go
+++ b/datasource/mongo/client/dao/dep.go
@@ -20,20 +20,17 @@ package dao
 import (
 	"context"
 
+	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
+
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
-	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/util"
 	"github.com/go-chassis/cari/discovery"
 )
 
-const (
-	Provider = "p"
-)
-
 func GetProviderDeps(ctx context.Context, provider *discovery.MicroService) (*discovery.MicroServiceDependency, error) {
-	return getServiceOfDeps(ctx, Provider, provider)
+	return getServiceOfDeps(ctx, datasource.Provider, provider)
 }
 
 func getServiceOfDeps(ctx context.Context, ruleType string, provider *discovery.MicroService) (*discovery.MicroServiceDependency, error) {
diff --git a/datasource/mongo/dep.go b/datasource/mongo/dep.go
index 80bb141..d83da13 100644
--- a/datasource/mongo/dep.go
+++ b/datasource/mongo/dep.go
@@ -22,18 +22,17 @@ import (
 	"errors"
 	"fmt"
 
-	"github.com/go-chassis/cari/discovery"
-	"go.mongodb.org/mongo-driver/bson"
-	"go.mongodb.org/mongo-driver/mongo/options"
+	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/etcd/path"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
-	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/log"
 	"github.com/apache/servicecomb-service-center/pkg/util"
+	"github.com/go-chassis/cari/discovery"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo/options"
 )
 
 type DepManager struct {
@@ -42,8 +41,7 @@ type DepManager struct {
 func (ds *DepManager) SearchProviderDependency(ctx context.Context, request *discovery.GetDependenciesRequest) (*discovery.GetProDependenciesResponse, error) {
 	domainProject := util.ParseDomainProject(ctx)
 	providerServiceID := request.ServiceId
-	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(providerServiceID))
-	provider, err := dao.GetService(ctx, filter)
+	provider, err := GetServiceByID(ctx, providerServiceID)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("query provider service failed, there is no provider %s in db", providerServiceID))
@@ -79,8 +77,7 @@ func (ds *DepManager) SearchProviderDependency(ctx context.Context, request *dis
 func (ds *DepManager) SearchConsumerDependency(ctx context.Context, request *discovery.GetDependenciesRequest) (*discovery.GetConDependenciesResponse, error) {
 	domainProject := util.ParseDomainProject(ctx)
 	consumerID := request.ServiceId
-	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(consumerID))
-	consumer, err := dao.GetService(ctx, filter)
+	consumer, err := GetServiceByID(ctx, consumerID)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("query consumer service failed, there is no consumer %s in db", consumerID))
@@ -353,40 +350,3 @@ func TransferToMicroServiceDependency(ctx context.Context, filter bson.M) (*disc
 	}
 	return microServiceDependency, nil
 }
-
-func GetServiceID(ctx context.Context, key *discovery.MicroServiceKey) (string, error) {
-	filter := mutil.NewBasicFilter(
-		ctx,
-		mutil.ServiceEnv(key.Environment),
-		mutil.ServiceAppID(key.AppId),
-		mutil.ServiceServiceName(key.ServiceName),
-		mutil.ServiceVersion(key.Version),
-	)
-	id, err := getServiceID(ctx, filter)
-	if err != nil && !errors.Is(err, datasource.ErrNoData) {
-		return "", err
-	}
-	if len(id) == 0 && len(key.Alias) != 0 {
-		filter = mutil.NewBasicFilter(
-			ctx,
-			mutil.ServiceEnv(key.Environment),
-			mutil.ServiceAppID(key.AppId),
-			mutil.ServiceAlias(key.Alias),
-			mutil.ServiceVersion(key.Version),
-		)
-		return getServiceID(ctx, filter)
-	}
-	return id, nil
-}
-
-func getServiceID(ctx context.Context, filter bson.M) (serviceID string, err error) {
-	svc, err := dao.GetService(ctx, filter)
-	if err != nil {
-		return
-	}
-	if svc != nil {
-		serviceID = svc.Service.ServiceId
-		return
-	}
-	return
-}
diff --git a/datasource/mongo/dep_util.go b/datasource/mongo/dep_util.go
index 05ecb6a..b17fc26 100644
--- a/datasource/mongo/dep_util.go
+++ b/datasource/mongo/dep_util.go
@@ -21,10 +21,9 @@ import (
 	"context"
 	"fmt"
 
-	pb "github.com/go-chassis/cari/discovery"
-
 	"github.com/apache/servicecomb-service-center/datasource/cache"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+	pb "github.com/go-chassis/cari/discovery"
 )
 
 func GetConsumerIDs(ctx context.Context, provider *pb.MicroService) ([]string, error) {
@@ -42,12 +41,9 @@ func GetConsumerIDs(ctx context.Context, provider *pb.MicroService) ([]string, e
 	}
 	consumerIDs := make([]string, 0, len(serviceDeps.Dependency))
 	for _, serviceKeys := range serviceDeps.Dependency {
-		id, ok := cache.GetServiceID(ctx, serviceKeys)
-		if !ok {
-			id, err = dao.GetServiceID(ctx, serviceKeys)
-			if err != nil {
-				return nil, err
-			}
+		id, err := GetServiceID(ctx, serviceKeys)
+		if err != nil {
+			return nil, err
 		}
 		consumerIDs = append(consumerIDs, id)
 	}
diff --git a/datasource/mongo/dependency_query.go b/datasource/mongo/dependency_query.go
index c927dce..4716b16 100644
--- a/datasource/mongo/dependency_query.go
+++ b/datasource/mongo/dependency_query.go
@@ -23,17 +23,15 @@ import (
 	"fmt"
 	"strings"
 
-	pb "github.com/go-chassis/cari/discovery"
-	"go.mongodb.org/mongo-driver/bson"
-	"go.mongodb.org/mongo-driver/mongo/options"
-
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/etcd/path"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/log"
+	pb "github.com/go-chassis/cari/discovery"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo/options"
 )
 
 type DependencyRelation struct {
@@ -86,8 +84,7 @@ func (dr *DependencyRelation) GetDependencyProviders(opts ...DependencyRelationF
 		}
 
 		for _, providerID := range providerIDs {
-			filter := util.NewBasicFilter(dr.ctx, util.ServiceServiceID(providerID))
-			provider, err := dao.GetService(dr.ctx, filter)
+			provider, err := GetServiceByID(dr.ctx, providerID)
 			if err != nil {
 				if errors.Is(err, datasource.ErrNoData) {
 					log.Warn(fmt.Sprintf("provider[%s/%s/%s/%s] does not exist",
diff --git a/datasource/mongo/event/instance_event_handler.go b/datasource/mongo/event/instance_event_handler.go
index cb4b486..0cac34e 100644
--- a/datasource/mongo/event/instance_event_handler.go
+++ b/datasource/mongo/event/instance_event_handler.go
@@ -22,20 +22,18 @@ import (
 	"fmt"
 	"time"
 
-	"github.com/go-chassis/cari/discovery"
+	simple "github.com/apache/servicecomb-service-center/pkg/time"
 
 	"github.com/apache/servicecomb-service-center/datasource"
-	"github.com/apache/servicecomb-service-center/datasource/cache"
 	"github.com/apache/servicecomb-service-center/datasource/mongo"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/sd"
 	"github.com/apache/servicecomb-service-center/pkg/dump"
 	"github.com/apache/servicecomb-service-center/pkg/log"
-	simple "github.com/apache/servicecomb-service-center/pkg/time"
 	"github.com/apache/servicecomb-service-center/pkg/util"
 	"github.com/apache/servicecomb-service-center/server/event"
 	"github.com/apache/servicecomb-service-center/server/syncernotify"
+	"github.com/go-chassis/cari/discovery"
 )
 
 // InstanceEventHandler is the handler to handle events
@@ -58,14 +56,11 @@ func (h InstanceEventHandler) OnEvent(evt sd.MongoEvent) {
 	providerInstanceID := instance.Instance.InstanceId
 	domainProject := instance.Domain + "/" + instance.Project
 	ctx := util.SetDomainProject(context.Background(), instance.Domain, instance.Project)
-	res, ok := cache.GetServiceByID(ctx, providerID)
-	var err error
-	if !ok {
-		res, err = dao.GetServiceByID(ctx, providerID)
-		if err != nil {
-			log.Error(fmt.Sprintf("caught [%s] instance[%s/%s] event, endpoints %v, get provider's file failed from db\n",
-				action, providerID, providerInstanceID, instance.Instance.Endpoints), err)
-		}
+
+	res, err := mongo.GetServiceByID(ctx, providerID)
+	if err != nil {
+		log.Error(fmt.Sprintf("caught [%s] instance[%s/%s] event, endpoints %v, get provider's file failed from db\n",
+			action, providerID, providerInstanceID, instance.Instance.Endpoints), err)
 	}
 	if res == nil {
 		return
diff --git a/datasource/mongo/instance_util.go b/datasource/mongo/instance_util.go
new file mode 100644
index 0000000..90b51a3
--- /dev/null
+++ b/datasource/mongo/instance_util.go
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package mongo
+
+import (
+	"context"
+
+	"github.com/apache/servicecomb-service-center/datasource/cache"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
+	"github.com/apache/servicecomb-service-center/pkg/util"
+	"github.com/go-chassis/cari/discovery"
+)
+
+func ExistInstance(ctx context.Context, serviceID string, instanceID string) (bool, error) {
+	inst, ok := cache.GetInstance(ctx, serviceID, instanceID)
+	if ok && inst != nil {
+		return true, nil
+	}
+
+	return dao.ExistInstance(ctx, serviceID, instanceID)
+}
+
+func GetInstance(ctx context.Context, serviceID string, instanceID string) (*model.Instance, error) {
+	inst, ok := cache.GetInstance(ctx, serviceID, instanceID)
+	if ok && inst != nil {
+		return inst, nil
+	}
+	filter := mutil.NewBasicFilter(ctx, mutil.InstanceServiceID(serviceID), mutil.InstanceInstanceID(instanceID))
+	return dao.GetInstance(ctx, filter)
+}
+
+func GetInstances(ctx context.Context) ([]*model.Instance, error) {
+	insts, ok := cache.GetInstances(ctx)
+	if ok {
+		return insts, nil
+	}
+	filter := mutil.NewBasicFilter(ctx)
+	return dao.GetInstances(ctx, filter)
+
+}
+
+func CountInstance(ctx context.Context, serviceID string) (int64, error) {
+	count, ok := cache.CountInstances(ctx, serviceID)
+	if ok {
+		return int64(count), nil
+	}
+	filter := mutil.NewDomainProjectFilter(util.ParseDomain(ctx), util.ParseProject(ctx), mutil.InstanceServiceID(serviceID))
+	return dao.CountInstance(ctx, filter)
+}
+
+func GetAllInstancesOfOneService(ctx context.Context, serviceID string) ([]*discovery.MicroServiceInstance, error) {
+	inst, ok := cache.GetMicroServiceInstancesByID(ctx, serviceID)
+	if ok && inst != nil {
+		return inst, nil
+	}
+
+	return dao.GetMicroServiceInstancesByID(ctx, serviceID)
+}
diff --git a/datasource/mongo/microservice_util.go b/datasource/mongo/microservice_util.go
new file mode 100644
index 0000000..91623aa
--- /dev/null
+++ b/datasource/mongo/microservice_util.go
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package mongo
+
+import (
+	"context"
+
+	"github.com/apache/servicecomb-service-center/datasource/cache"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
+	"github.com/apache/servicecomb-service-center/pkg/util"
+	"github.com/go-chassis/cari/discovery"
+	"go.mongodb.org/mongo-driver/bson"
+)
+
+func GetServiceByID(ctx context.Context, serviceID string) (*model.Service, error) {
+	svc, exist := cache.GetServiceByID(ctx, serviceID)
+	if exist && svc != nil {
+		return svc, nil
+	}
+
+	return dao.GetServiceByID(ctx, serviceID)
+}
+
+func GetServiceByIDAcrossDomain(ctx context.Context, serviceID string) (*model.Service, error) {
+	svc, exist := cache.GetServiceByIDAcrossDomain(ctx, serviceID)
+	if exist && svc != nil {
+		return svc, nil
+	}
+	providerDomain, providerProject := util.ParseTargetDomain(ctx), util.ParseTargetProject(ctx)
+	filter := mutil.NewDomainProjectFilter(providerDomain, providerProject, mutil.ServiceServiceID(serviceID))
+	return dao.GetService(ctx, filter)
+}
+
+func ServiceExistID(ctx context.Context, serviceID string) (bool, error) {
+	svc, exist := cache.GetServiceByID(ctx, serviceID)
+	if exist && svc != nil {
+		return true, nil
+	}
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(serviceID))
+	return client.GetMongoClient().DocExist(ctx, model.CollectionService, filter)
+}
+
+func GetAllServicesByDomainProject(ctx context.Context) ([]*model.Service, error) {
+	services, exist := cache.GetServicesByDomainProject(util.ParseDomainProject(ctx))
+	if exist {
+		return services, nil
+	}
+
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
+	filter := bson.M{model.ColumnDomain: domain, model.ColumnProject: project}
+	return dao.GetServices(ctx, filter)
+}
+
+func GetAllMicroServicesByDomainProject(ctx context.Context) ([]*discovery.MicroService, error) {
+	services, exist := cache.GetMicroServicesByDomainProject(util.ParseDomainProject(ctx))
+	if exist {
+		return services, nil
+	}
+
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
+	filter := bson.M{model.ColumnDomain: domain, model.ColumnProject: project}
+	return dao.GetMicroServices(ctx, filter)
+}
+
+func GetServiceID(ctx context.Context, key *discovery.MicroServiceKey) (string, error) {
+	serviceID, exist := cache.GetServiceID(ctx, key)
+	if exist && len(serviceID) != 0 {
+		return serviceID, nil
+	}
+	return dao.GetServiceID(ctx, key)
+}
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index 037d20a..2763de8 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -28,13 +28,6 @@ import (
 	"strings"
 	"time"
 
-	"github.com/go-chassis/cari/discovery"
-	"github.com/go-chassis/cari/pkg/errsvc"
-	"github.com/jinzhu/copier"
-	"go.mongodb.org/mongo-driver/bson"
-	"go.mongodb.org/mongo-driver/mongo"
-	"go.mongodb.org/mongo-driver/mongo/options"
-
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/cache"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
@@ -47,7 +40,13 @@ import (
 	apt "github.com/apache/servicecomb-service-center/server/core"
 	"github.com/apache/servicecomb-service-center/server/plugin/quota"
 	"github.com/apache/servicecomb-service-center/server/plugin/uuid"
+	"github.com/go-chassis/cari/discovery"
+	"github.com/go-chassis/cari/pkg/errsvc"
 	"github.com/go-chassis/foundation/gopool"
+	"github.com/jinzhu/copier"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo"
+	"go.mongodb.org/mongo-driver/mongo/options"
 )
 
 const baseTen = 10
@@ -150,12 +149,7 @@ func (ds *MetadataManager) RegisterService(ctx context.Context, request *discove
 }
 
 func (ds *MetadataManager) GetServices(ctx context.Context, request *discovery.GetServicesRequest) (*discovery.GetServicesResponse, error) {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-
-	filter := bson.M{model.ColumnDomain: domain, model.ColumnProject: project}
-
-	services, err := dao.GetMicroServices(ctx, filter)
+	services, err := GetAllMicroServicesByDomainProject(ctx)
 	if err != nil {
 		return &discovery.GetServicesResponse{
 			Response: discovery.CreateResponse(discovery.ErrInternal, "get services data failed."),
@@ -203,18 +197,15 @@ func (ds *MetadataManager) ListApp(ctx context.Context, request *discovery.GetAp
 }
 
 func (ds *MetadataManager) GetService(ctx context.Context, request *discovery.GetServiceRequest) (*discovery.MicroService, error) {
-	svc, ok := cache.GetServiceByID(ctx, request.ServiceId)
-	if !ok {
-		var err error
-		svc, err = dao.GetServiceByID(ctx, request.ServiceId)
-		if err != nil {
-			if errors.Is(err, datasource.ErrNoData) {
-				log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId))
-				return nil, discovery.NewError(discovery.ErrServiceNotExists, "Service not exist.")
-			}
-			log.Error(fmt.Sprintf("failed to get single service %s from mongo", request.ServiceId), err)
-			return nil, discovery.NewError(discovery.ErrInternal, "get service data from mongodb failed.")
+	svc, err := GetServiceByID(ctx, request.ServiceId)
+
+	if err != nil {
+		if errors.Is(err, datasource.ErrNoData) {
+			log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId))
+			return nil, discovery.NewError(discovery.ErrServiceNotExists, "Service not exist.")
 		}
+		log.Error(fmt.Sprintf("failed to get single service %s from mongo", request.ServiceId), err)
+		return nil, discovery.NewError(discovery.ErrInternal, "get service data from mongodb failed.")
 	}
 	return svc.Service, nil
 }
@@ -294,8 +285,7 @@ func (ds *MetadataManager) DelServicePri(ctx context.Context, serviceID string,
 		log.Error(fmt.Sprintf("%s micro-service %s failed, operator: %s", title, serviceID, remoteIP), mutil.ErrNotAllowDeleteSC)
 		return discovery.CreateResponse(discovery.ErrInvalidParams, mutil.ErrNotAllowDeleteSC.Error()), nil
 	}
-	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(serviceID))
-	microservice, err := dao.GetService(ctx, filter)
+	microservice, err := GetServiceByID(ctx, serviceID)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("%s micro-service %s failed, service does not exist, operator: %s",
@@ -407,8 +397,7 @@ func (ds *MetadataManager) GetDeleteServiceFunc(ctx context.Context, serviceID s
 
 func (ds *MetadataManager) GetServiceDetail(ctx context.Context, request *discovery.GetServiceRequest) (
 	*discovery.ServiceDetail, error) {
-	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
-	mgSvc, err := dao.GetService(ctx, filter)
+	mgSvc, err := GetServiceByID(ctx, request.ServiceId)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			return nil, discovery.NewError(discovery.ErrServiceNotExists, "Service does not exist.")
@@ -421,7 +410,7 @@ func (ds *MetadataManager) GetServiceDetail(ctx context.Context, request *discov
 		AppId:       svc.AppId,
 		ServiceName: svc.ServiceName,
 	}
-	filter = mutil.NewBasicFilter(ctx,
+	filter := mutil.NewBasicFilter(ctx,
 		mutil.ServiceEnv(key.Environment),
 		mutil.ServiceAppID(key.AppId),
 		mutil.ServiceServiceName(key.ServiceName),
@@ -559,8 +548,7 @@ func (ds *MetadataManager) AddTags(ctx context.Context, request *discovery.AddSe
 }
 
 func (ds *MetadataManager) GetTags(ctx context.Context, request *discovery.GetServiceTagsRequest) (*discovery.GetServiceTagsResponse, error) {
-	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
-	svc, err := dao.GetService(ctx, filter)
+	svc, err := GetServiceByID(ctx, request.ServiceId)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId))
@@ -580,8 +568,7 @@ func (ds *MetadataManager) GetTags(ctx context.Context, request *discovery.GetSe
 }
 
 func (ds *MetadataManager) UpdateTag(ctx context.Context, request *discovery.UpdateServiceTagRequest) (*discovery.UpdateServiceTagResponse, error) {
-	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
-	svc, err := dao.GetService(ctx, filter)
+	svc, err := GetServiceByID(ctx, request.ServiceId)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId))
@@ -613,6 +600,7 @@ func (ds *MetadataManager) UpdateTag(ctx context.Context, request *discovery.Upd
 	updateFilter := mutil.NewFilter(
 		mutil.Set(setFilter),
 	)
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
 	err = dao.UpdateService(ctx, filter, updateFilter)
 	if err != nil {
 		log.Error(fmt.Sprintf("update service %s tags failed", request.ServiceId), err)
@@ -626,8 +614,7 @@ func (ds *MetadataManager) UpdateTag(ctx context.Context, request *discovery.Upd
 }
 
 func (ds *MetadataManager) DeleteTags(ctx context.Context, request *discovery.DeleteServiceTagsRequest) (*discovery.DeleteServiceTagsResponse, error) {
-	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
-	svc, err := dao.GetService(ctx, filter)
+	svc, err := GetServiceByID(ctx, request.ServiceId)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId))
@@ -661,6 +648,7 @@ func (ds *MetadataManager) DeleteTags(ctx context.Context, request *discovery.De
 	updateFilter := mutil.NewFilter(
 		mutil.Set(setFilter),
 	)
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
 	err = dao.UpdateService(ctx, filter, updateFilter)
 	if err != nil {
 		log.Error(fmt.Sprintf("delete service %s tags failed", request.ServiceId), err)
@@ -1002,9 +990,8 @@ func (ds *MetadataManager) modifySchemas(ctx context.Context, service *discovery
 func (ds *MetadataManager) modifySchema(ctx context.Context, serviceID string, schema *discovery.Schema) *errsvc.Error {
 	domain := util.ParseDomain(ctx)
 	project := util.ParseProject(ctx)
-	filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(serviceID))
 	remoteIP := util.GetIPFromContext(ctx)
-	svc, err := dao.GetService(ctx, filter)
+	svc, err := GetServiceByID(ctx, serviceID)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			return discovery.NewError(discovery.ErrServiceNotExists, "Service does not exist.")
@@ -1024,7 +1011,7 @@ func (ds *MetadataManager) modifySchema(ctx context.Context, serviceID string, s
 		if len(microservice.Schemas) != 0 && !isExist {
 			return ErrUndefinedSchemaID
 		}
-		filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(serviceID), mutil.SchemaID(schema.SchemaId))
+		filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(serviceID), mutil.SchemaID(schema.SchemaId))
 		respSchema, err := dao.GetSchema(ctx, filter)
 		if err != nil {
 			return discovery.NewError(discovery.ErrUnavailableBackend, err.Error())
@@ -1052,7 +1039,7 @@ func (ds *MetadataManager) modifySchema(ctx context.Context, serviceID string, s
 		}
 	}
 	if len(newSchemas) != 0 {
-		filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(serviceID))
+		filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(serviceID))
 		setFilter := mutil.NewFilter(
 			mutil.ServiceSchemas(newSchemas),
 		)
@@ -1064,7 +1051,7 @@ func (ds *MetadataManager) modifySchema(ctx context.Context, serviceID string, s
 			return discovery.NewError(discovery.ErrInternal, err.Error())
 		}
 	}
-	filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(serviceID), mutil.SchemaID(schema.SchemaId))
+	filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(serviceID), mutil.SchemaID(schema.SchemaId))
 	setFilter := mutil.NewFilter(
 		mutil.Schema(schema.Schema),
 		mutil.SchemaSummary(schema.Summary),
@@ -1081,11 +1068,6 @@ func (ds *MetadataManager) isSchemaEditable() bool {
 	return !ds.SchemaNotEditable
 }
 
-func ServiceExistID(ctx context.Context, serviceID string) (bool, error) {
-	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(serviceID))
-	return client.GetMongoClient().DocExist(ctx, model.CollectionService, filter)
-}
-
 func getServiceDetailUtil(ctx context.Context, mgs *model.Service, countOnly bool, options []string) (*discovery.ServiceDetail, error) {
 	serviceDetail := new(discovery.ServiceDetail)
 	serviceID := mgs.Service.ServiceId
@@ -1102,8 +1084,7 @@ func getServiceDetailUtil(ctx context.Context, mgs *model.Service, countOnly boo
 			serviceDetail.Tags = mgs.Tags
 		case "instances":
 			if countOnly {
-				filter := mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(serviceID))
-				instanceCount, err := dao.CountInstance(ctx, filter)
+				instanceCount, err := CountInstance(ctx, serviceID)
 				if err != nil {
 					log.Error(fmt.Sprintf("get number of service [%s]'s instances failed", serviceID), err)
 					return nil, err
@@ -1273,7 +1254,7 @@ func preProcessRegister(ctx context.Context, instance *discovery.MicroServiceIns
 }
 
 func (ds *MetadataManager) ExistInstanceByID(ctx context.Context, request *discovery.MicroServiceInstanceKey) (*discovery.GetExistenceByIDResponse, error) {
-	exist, _ := dao.ExistInstance(ctx, request.ServiceId, request.InstanceId)
+	exist, _ := ExistInstance(ctx, request.ServiceId, request.InstanceId)
 	if !exist {
 		return &discovery.GetExistenceByIDResponse{
 			Response: discovery.CreateResponse(discovery.ErrInstanceNotExists, "Check instance exist failed."),
@@ -1289,14 +1270,12 @@ func (ds *MetadataManager) ExistInstanceByID(ctx context.Context, request *disco
 
 // GetInstance returns instance under the current domain
 func (ds *MetadataManager) GetInstance(ctx context.Context, request *discovery.GetOneInstanceRequest) (*discovery.GetOneInstanceResponse, error) {
-	var service *model.Service
+	service := &model.Service{}
+	service.Service = &discovery.MicroService{}
 	var err error
 	var serviceIDs []string
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
 	if len(request.ConsumerServiceId) > 0 {
-		filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(request.ConsumerServiceId))
-		service, err = dao.GetService(ctx, filter)
+		service, err = GetServiceByID(ctx, request.ConsumerServiceId)
 		if err != nil {
 			if errors.Is(err, datasource.ErrNoData) {
 				log.Debug(fmt.Sprintf("consumer does not exist, consumer %s find provider instance %s %s",
@@ -1313,8 +1292,7 @@ func (ds *MetadataManager) GetInstance(ctx context.Context, request *discovery.G
 			}, err
 		}
 	}
-	filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(request.ProviderServiceId))
-	provider, err := dao.GetService(ctx, filter)
+	provider, err := GetServiceByID(ctx, request.ProviderServiceId)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("provider does not exist, consumer %s find provider instance %s %s",
@@ -1354,15 +1332,22 @@ func (ds *MetadataManager) GetInstance(ctx context.Context, request *discovery.G
 			Response: discovery.CreateResponse(discovery.ErrInstanceNotExists, mes.Error()),
 		}, nil
 	}
-	instances, ok := cache.GetMicroServiceInstancesByID(request.ProviderServiceId)
-	if !ok {
-		instances, err = dao.GetMicroServiceInstancesByID(ctx, request.ProviderServiceId)
-		if err != nil {
-			log.Error(fmt.Sprintf("get instance failed %s", findFlag()), err)
-			return &discovery.GetOneInstanceResponse{
-				Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
-			}, err
-		}
+
+	instances, err := GetAllInstancesOfOneService(ctx, request.ProviderServiceId)
+
+	if err != nil {
+		log.Error(fmt.Sprintf("get instance failed %s", findFlag()), err)
+		return &discovery.GetOneInstanceResponse{
+			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
+		}, err
+	}
+
+	if len(instances) == 0 {
+		mes := fmt.Errorf("%s failed, provider instance does not exist", findFlag())
+		log.Error("find Instances by ProviderID failed", mes)
+		return &discovery.GetOneInstanceResponse{
+			Response: discovery.CreateResponse(discovery.ErrInstanceNotExists, mes.Error()),
+		}, nil
 	}
 
 	instance := instances[0]
@@ -1403,41 +1388,17 @@ func (ds *MetadataManager) GetInstances(ctx context.Context, request *discovery.
 	var err error
 
 	if len(request.ConsumerServiceId) > 0 {
-		var exist bool
-		service, exist = cache.GetServiceByID(ctx, request.ConsumerServiceId)
-		if !exist {
-			service, err = dao.GetServiceByID(ctx, request.ConsumerServiceId)
-			if err != nil {
-				if errors.Is(err, datasource.ErrNoData) {
-					log.Debug(fmt.Sprintf("consumer does not exist, consumer %s find provider %s instances",
-						request.ConsumerServiceId, request.ProviderServiceId))
-					return &discovery.GetInstancesResponse{
-						Response: discovery.CreateResponse(discovery.ErrServiceNotExists,
-							fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)),
-					}, nil
-				}
-				log.Error(fmt.Sprintf("get consumer failed, consumer %s find provider %s instances",
-					request.ConsumerServiceId, request.ProviderServiceId), err)
-				return &discovery.GetInstancesResponse{
-					Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
-				}, err
-			}
-		}
-	}
-
-	provider, ok := cache.GetServiceByID(ctx, request.ProviderServiceId)
-	if !ok {
-		provider, err = dao.GetServiceByID(ctx, request.ProviderServiceId)
+		service, err = GetServiceByID(ctx, request.ConsumerServiceId)
 		if err != nil {
 			if errors.Is(err, datasource.ErrNoData) {
-				log.Debug(fmt.Sprintf("provider does not exist, consumer %s find provider %s  instances",
+				log.Debug(fmt.Sprintf("consumer does not exist, consumer %s find provider %s instances",
 					request.ConsumerServiceId, request.ProviderServiceId))
 				return &discovery.GetInstancesResponse{
 					Response: discovery.CreateResponse(discovery.ErrServiceNotExists,
-						fmt.Sprintf("provider[%s] does not exist.", request.ProviderServiceId)),
+						fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)),
 				}, nil
 			}
-			log.Error(fmt.Sprintf("get provider failed, consumer %s find provider instances %s",
+			log.Error(fmt.Sprintf("get consumer failed, consumer %s find provider %s instances",
 				request.ConsumerServiceId, request.ProviderServiceId), err)
 			return &discovery.GetInstancesResponse{
 				Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
@@ -1445,6 +1406,23 @@ func (ds *MetadataManager) GetInstances(ctx context.Context, request *discovery.
 		}
 	}
 
+	provider, err := GetServiceByID(ctx, request.ProviderServiceId)
+	if err != nil {
+		if errors.Is(err, datasource.ErrNoData) {
+			log.Debug(fmt.Sprintf("provider does not exist, consumer %s find provider %s  instances",
+				request.ConsumerServiceId, request.ProviderServiceId))
+			return &discovery.GetInstancesResponse{
+				Response: discovery.CreateResponse(discovery.ErrServiceNotExists,
+					fmt.Sprintf("provider[%s] does not exist.", request.ProviderServiceId)),
+			}, nil
+		}
+		log.Error(fmt.Sprintf("get provider failed, consumer %s find provider instances %s",
+			request.ConsumerServiceId, request.ProviderServiceId), err)
+		return &discovery.GetInstancesResponse{
+			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
+		}, err
+	}
+
 	findFlag := func() string {
 		return fmt.Sprintf("consumer[%s][%s/%s/%s/%s] find provider[%s][%s/%s/%s/%s] instances",
 			request.ConsumerServiceId, service.Service.Environment, service.Service.AppId, service.Service.ServiceName, service.Service.Version,
@@ -1460,15 +1438,13 @@ func (ds *MetadataManager) GetInstances(ctx context.Context, request *discovery.
 			Response: discovery.CreateResponse(discovery.ErrServiceNotExists, mes.Error()),
 		}, nil
 	}
-	instances, ok := cache.GetMicroServiceInstancesByID(request.ProviderServiceId)
-	if !ok {
-		instances, err = dao.GetMicroServiceInstancesByID(ctx, request.ProviderServiceId)
-		if err != nil {
-			log.Error(fmt.Sprintf("get instances failed %s", findFlag()), err)
-			return &discovery.GetInstancesResponse{
-				Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
-			}, err
-		}
+
+	instances, err := GetAllInstancesOfOneService(ctx, request.ProviderServiceId)
+	if err != nil {
+		log.Error(fmt.Sprintf("get instances failed %s", findFlag()), err)
+		return &discovery.GetInstancesResponse{
+			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
+		}, err
 	}
 	newRev, _ := formatRevision(request.ConsumerServiceId, instances)
 	if rev == newRev {
@@ -1492,8 +1468,7 @@ func (ds *MetadataManager) GetProviderInstances(ctx context.Context, request *di
 }
 
 func (ds *MetadataManager) GetAllInstances(ctx context.Context, request *discovery.GetAllInstancesRequest) (*discovery.GetAllInstancesResponse, error) {
-	filter := mutil.NewBasicFilter(ctx)
-	findRes, err := client.GetMongoClient().Find(ctx, model.CollectionInstance, filter)
+	findRes, err := GetInstances(ctx)
 	if err != nil {
 		return nil, err
 	}
@@ -1501,15 +1476,8 @@ func (ds *MetadataManager) GetAllInstances(ctx context.Context, request *discove
 		Response: discovery.CreateResponse(discovery.ResponseSuccess, "Get all instances successfully"),
 	}
 
-	for findRes.Next(ctx) {
-		var instance model.Instance
-		err := findRes.Decode(&instance)
-		if err != nil {
-			return &discovery.GetAllInstancesResponse{
-				Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
-			}, err
-		}
-		resp.Instances = append(resp.Instances, instance.Instance)
+	for _, inst := range findRes {
+		resp.Instances = append(resp.Instances, inst.Instance)
 	}
 
 	return resp, nil
@@ -1571,7 +1539,7 @@ func (ds *MetadataManager) UpdateInstanceStatus(ctx context.Context, request *di
 
 	// todo finish get instance
 	filter := mutil.NewBasicFilter(ctx, mutil.InstanceServiceID(request.ServiceId), mutil.InstanceInstanceID(request.InstanceId))
-	instance, err := dao.GetInstance(ctx, filter)
+	instance, err := GetInstance(ctx, request.ServiceId, request.InstanceId)
 	if err != nil {
 		log.Error(fmt.Sprintf("update instance %s status failed", updateStatusFlag), err)
 		return &discovery.UpdateInstanceStatusResponse{
@@ -1613,8 +1581,7 @@ func (ds *MetadataManager) UpdateInstanceProperties(ctx context.Context, request
 	instanceFlag := util.StringJoin([]string{request.ServiceId, request.InstanceId}, "/")
 	domain := util.ParseDomain(ctx)
 	project := util.ParseProject(ctx)
-	filter := mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(request.ServiceId), mutil.InstanceInstanceID(request.InstanceId))
-	instance, err := dao.GetInstance(ctx, filter)
+	instance, err := GetInstance(ctx, request.ServiceId, request.InstanceId)
 	if err != nil {
 		log.Error(fmt.Sprintf("update instance %s properties failed", instanceFlag), err)
 		return &discovery.UpdateInstancePropsResponse{
@@ -1632,7 +1599,7 @@ func (ds *MetadataManager) UpdateInstanceProperties(ctx context.Context, request
 	copyInstanceRef.Instance.Properties = request.Properties
 
 	// todo finish update instance
-	filter = mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(request.ServiceId), mutil.InstanceInstanceID(request.InstanceId))
+	filter := mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(request.ServiceId), mutil.InstanceInstanceID(request.InstanceId))
 	setFilter := mutil.NewFilter(
 		mutil.InstanceModTime(strconv.FormatInt(time.Now().Unix(), baseTen)),
 		mutil.InstanceProperties(copyInstanceRef.Instance.Properties),
@@ -1887,8 +1854,7 @@ func (ds *MetadataManager) findInstance(ctx context.Context, request *discovery.
 	domainProject := util.ParseDomainProject(ctx)
 	service := &model.Service{Service: &discovery.MicroService{Environment: request.Environment}}
 	if len(request.ConsumerServiceId) > 0 {
-		filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ConsumerServiceId))
-		service, err = dao.GetService(ctx, filter)
+		service, err = GetServiceByID(ctx, request.ConsumerServiceId)
 		if err != nil {
 			if errors.Is(err, datasource.ErrNoData) {
 				log.Debug(fmt.Sprintf("consumer does not exist, consumer %s find provider %s/%s/%s",
@@ -1979,8 +1945,7 @@ func (ds *MetadataManager) findInstance(ctx context.Context, request *discovery.
 
 func (ds *MetadataManager) reshapeProviderKey(ctx context.Context, provider *discovery.MicroServiceKey, providerID string) (*discovery.MicroServiceKey, error) {
 	//维护version的规则,service name 可能是别名,所以重新获取
-	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(providerID))
-	providerService, err := dao.GetService(ctx, filter)
+	providerService, err := GetServiceByID(ctx, providerID)
 	if err != nil {
 		return nil, err
 	}
@@ -2168,6 +2133,10 @@ func filterServices(ctx context.Context, key *discovery.MicroServiceKey) ([]*mod
 	if len(tenant) != 2 {
 		return nil, errors.New("invalid 'domain' or 'project'")
 	}
+	services, ok := cache.GetServiceByName(ctx, key)
+	if ok {
+		return services, nil
+	}
 	serviceNameOption := mutil.ServiceServiceName(key.ServiceName)
 	if len(key.Alias) > 0 {
 		serviceNameOption = mutil.Or(serviceNameOption, mutil.ServiceAlias(key.Alias))
@@ -2232,11 +2201,7 @@ func accessible(ctx context.Context, consumerID string, providerID string) *errs
 		return nil
 	}
 
-	consumerDomain, consumerProject := util.ParseDomain(ctx), util.ParseProject(ctx)
-	providerDomain, providerProject := util.ParseTargetDomain(ctx), util.ParseTargetProject(ctx)
-
-	filter := mutil.NewDomainProjectFilter(consumerDomain, consumerProject, mutil.ServiceServiceID(consumerID))
-	consumerService, err := dao.GetService(ctx, filter)
+	consumerService, err := GetServiceByID(ctx, consumerID)
 	if err != nil {
 		return discovery.NewError(discovery.ErrInternal, fmt.Sprintf("an error occurred in query consumer(%s)", err.Error()))
 	}
@@ -2244,9 +2209,8 @@ func accessible(ctx context.Context, consumerID string, providerID string) *errs
 		return discovery.NewError(discovery.ErrServiceNotExists, "consumer serviceID is invalid")
 	}
 
-	filter = mutil.NewDomainProjectFilter(providerDomain, providerProject, mutil.ServiceServiceID(providerID))
 	// 跨应用权限
-	providerService, err := dao.GetService(ctx, filter)
+	providerService, err := GetServiceByIDAcrossDomain(ctx, providerID)
 	if err != nil {
 		return discovery.NewError(discovery.ErrInternal, fmt.Sprintf("an error occurred in query provider(%s)", err.Error()))
 	}
diff --git a/datasource/mongo/sd/instance_cache.go b/datasource/mongo/sd/instance_cache.go
index 8ff80bb..a5db156 100644
--- a/datasource/mongo/sd/instance_cache.go
+++ b/datasource/mongo/sd/instance_cache.go
@@ -19,11 +19,12 @@ package sd
 
 import (
 	"reflect"
+	"strings"
 
-	cmap "github.com/orcaman/concurrent-map"
-
+	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/sdcommon"
+	cmap "github.com/orcaman/concurrent-map"
 	"go.mongodb.org/mongo-driver/bson"
 )
 
@@ -38,7 +39,7 @@ type instanceStore struct {
 func init() {
 	RegisterCacher(instance, newInstanceStore)
 	InstIndexCols = NewIndexCols()
-	InstIndexCols.AddIndexFunc(InstSericeIDIndex)
+	InstIndexCols.AddIndexFunc(InstServiceIDIndex)
 }
 
 func newInstanceStore() *MongoCacher {
@@ -158,7 +159,7 @@ func (s *instanceStore) isValueNotUpdated(value interface{}, newValue interface{
 	return reflect.DeepEqual(newInst, oldInst)
 }
 
-func InstSericeIDIndex(data interface{}) string {
+func InstServiceIDIndex(data interface{}) string {
 	inst := data.(model.Instance)
-	return inst.Instance.ServiceId
+	return strings.Join([]string{inst.Domain, inst.Project, inst.Instance.ServiceId}, datasource.SPLIT)
 }
diff --git a/datasource/mongo/sd/instancec_test.go b/datasource/mongo/sd/instancec_test.go
index 29aaf40..0f38586 100644
--- a/datasource/mongo/sd/instancec_test.go
+++ b/datasource/mongo/sd/instancec_test.go
@@ -66,22 +66,45 @@ func TestInstCacheBasicFunc(t *testing.T) {
 		DocumentID: "id2",
 		Value:      inst2,
 	}
-	t.Run("update&&delete instCache, should pass", func(t *testing.T) {
+	t.Run("add instCache, should pass", func(t *testing.T) {
 		instanceCache.cache.ProcessUpdate(event1)
 		assert.Equal(t, instanceCache.cache.Size(), 1)
 		assert.Nil(t, instanceCache.cache.Get("id_not_exist"))
 		assert.Equal(t, inst1.Instance.InstanceId, instanceCache.cache.Get("id1").(model.Instance).Instance.InstanceId)
-		assert.Len(t, instanceCache.cache.GetValue("svcid"), 1)
+		assert.Len(t, instanceCache.cache.GetValue("default/default/svcid"), 1)
 		instanceCache.cache.ProcessUpdate(event2)
 		assert.Equal(t, instanceCache.cache.Size(), 2)
-		assert.Len(t, instanceCache.cache.GetValue("svcid"), 2)
+		assert.Len(t, instanceCache.cache.GetValue("default/default/svcid"), 2)
+
+	})
+
+	t.Run("update instCache, should pass", func(t *testing.T) {
+		assert.Equal(t, inst1, instanceCache.cache.Get("id1").(model.Instance))
+		instUpdate := model.Instance{
+			Domain:  "default",
+			Project: "default",
+			Instance: &discovery.MicroServiceInstance{
+				InstanceId: "123456789",
+				ServiceId:  "svcid",
+				HostName:   "hostUpdate",
+			},
+		}
+		eventUpdate := MongoEvent{
+			DocumentID: "id1",
+			Value:      instUpdate,
+		}
+		instanceCache.cache.ProcessUpdate(eventUpdate)
+		assert.Equal(t, instUpdate, instanceCache.cache.Get("id1").(model.Instance))
+	})
+
+	t.Run("delete instCache, should pass", func(t *testing.T) {
 		instanceCache.cache.ProcessDelete(event1)
 		assert.Nil(t, instanceCache.cache.Get("id1"))
-		assert.Len(t, instanceCache.cache.GetValue("svcid"), 1)
+		assert.Len(t, instanceCache.cache.GetValue("default/default/svcid"), 1)
 		instanceCache.cache.ProcessDelete(event2)
-		assert.Len(t, instanceCache.cache.GetValue("svcid"), 0)
+		assert.Len(t, instanceCache.cache.GetValue("default/default/svcid"), 0)
 		assert.Nil(t, instanceCache.cache.Get("id2"))
-		assert.Len(t, instanceCache.cache.GetValue("svcid"), 0)
+		assert.Len(t, instanceCache.cache.GetValue("default/default/svcid"), 0)
 	})
 }
 
diff --git a/datasource/mongo/sd/service_cache.go b/datasource/mongo/sd/service_cache.go
index 218a56d..09e3b6a 100644
--- a/datasource/mongo/sd/service_cache.go
+++ b/datasource/mongo/sd/service_cache.go
@@ -23,6 +23,7 @@ import (
 
 	cmap "github.com/orcaman/concurrent-map"
 
+	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/sdcommon"
 	"go.mongodb.org/mongo-driver/bson"
@@ -42,6 +43,7 @@ func init() {
 	ServiceIndexCols.AddIndexFunc(ServiceIDIndex)
 	ServiceIndexCols.AddIndexFunc(ServiceInfoIndex)
 	ServiceIndexCols.AddIndexFunc(ServiceVersionIndex)
+	ServiceIndexCols.AddIndexFunc(ServiceDomainProjectIndex)
 }
 
 func newServiceStore() *MongoCacher {
@@ -162,15 +164,20 @@ func (s *serviceStore) isValueNotUpdated(value interface{}, newValue interface{}
 
 func ServiceIDIndex(data interface{}) string {
 	svc := data.(model.Service)
-	return strings.Join([]string{svc.Domain, svc.Project, svc.Service.ServiceId}, "/")
+	return strings.Join([]string{svc.Domain, svc.Project, svc.Service.ServiceId}, datasource.SPLIT)
 }
 
 func ServiceInfoIndex(data interface{}) string {
 	svc := data.(model.Service)
-	return strings.Join([]string{svc.Domain, svc.Project, svc.Service.AppId, svc.Service.ServiceName, svc.Service.Version}, "/")
+	return strings.Join([]string{svc.Domain, svc.Project, svc.Service.AppId, svc.Service.ServiceName, svc.Service.Version}, datasource.SPLIT)
 }
 
 func ServiceVersionIndex(data interface{}) string {
 	svc := data.(model.Service)
-	return strings.Join([]string{svc.Domain, svc.Project, svc.Service.AppId, svc.Service.ServiceName}, "/")
+	return strings.Join([]string{svc.Domain, svc.Project, svc.Service.AppId, svc.Service.ServiceName}, datasource.SPLIT)
+}
+
+func ServiceDomainProjectIndex(data interface{}) string {
+	svc := data.(model.Service)
+	return strings.Join([]string{svc.Domain, svc.Project}, datasource.SPLIT)
 }
diff --git a/datasource/mongo/sd/servicec_test.go b/datasource/mongo/sd/servicec_test.go
index 3cbb756..ccede25 100644
--- a/datasource/mongo/sd/servicec_test.go
+++ b/datasource/mongo/sd/servicec_test.go
@@ -71,7 +71,8 @@ func TestServiceCacheBasicFunc(t *testing.T) {
 		DocumentID: "id2",
 		Value:      svc2,
 	}
-	t.Run("update&&delete serviceCache, should pass", func(t *testing.T) {
+
+	t.Run("add serviceCache, should pass", func(t *testing.T) {
 		serviceCache.cache.ProcessUpdate(event1)
 		assert.Equal(t, serviceCache.cache.Size(), 1)
 		assert.Nil(t, serviceCache.cache.Get("id_not_exist"))
@@ -82,6 +83,32 @@ func TestServiceCacheBasicFunc(t *testing.T) {
 		assert.Len(t, serviceCache.cache.GetValue("default/default/appid1/svc1/1.0"), 2)
 		assert.Len(t, serviceCache.cache.GetValue("default/default/987654321"), 1)
 		assert.Len(t, serviceCache.cache.GetValue("default/default/123456789"), 1)
+
+	})
+
+	t.Run("update serviceCache, should pass", func(t *testing.T) {
+		assert.Equal(t, svc1, serviceCache.cache.Get("id1").(model.Service))
+		var svc1Update = model.Service{
+			Domain:  "default",
+			Project: "default",
+			Tags:    nil,
+			Service: &discovery.MicroService{
+				ServiceId:   "123456789",
+				AppId:       "appid1",
+				ServiceName: "svc1",
+				Version:     "1.0",
+				Description: "update",
+			},
+		}
+		eventUpdate := MongoEvent{
+			DocumentID: "id1",
+			Value:      svc1Update,
+		}
+		serviceCache.cache.ProcessUpdate(eventUpdate)
+		assert.Equal(t, svc1Update, serviceCache.cache.Get("id1").(model.Service))
+	})
+
+	t.Run("delete serviceCache, should pass", func(t *testing.T) {
 		serviceCache.cache.ProcessDelete(event1)
 		assert.Nil(t, serviceCache.cache.Get("id1"))
 		assert.Len(t, serviceCache.cache.GetValue("default/default/appid1/svc1/1.0"), 1)
diff --git a/datasource/mongo/util.go b/datasource/mongo/util.go
index bdae287..3644dfb 100644
--- a/datasource/mongo/util.go
+++ b/datasource/mongo/util.go
@@ -21,8 +21,6 @@ import (
 	"context"
 
 	"github.com/apache/servicecomb-service-center/datasource"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
-	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/util"
 	pb "github.com/go-chassis/cari/discovery"
 	"github.com/go-chassis/foundation/gopool"
@@ -49,9 +47,7 @@ func statistics(ctx context.Context, withShared bool) (*pb.Statistics, error) {
 		Apps:      &pb.StApp{},
 	}
 
-	filter := mutil.NewBasicFilter(ctx)
-
-	services, err := dao.GetMicroServices(ctx, filter)
+	services, err := GetAllMicroServicesByDomainProject(ctx)
 	if err != nil {
 		return nil, err
 	}
@@ -68,7 +64,7 @@ func statistics(ctx context.Context, withShared bool) (*pb.Statistics, error) {
 		getInstanceCountByDomain(ctx, svcIDToNonVerKey, respGetInstanceCountByDomain)
 	})
 
-	instances, err := dao.GetInstances(ctx, filter)
+	instances, err := GetInstances(ctx)
 	if err != nil {
 		return nil, err
 	}
@@ -88,11 +84,8 @@ func statistics(ctx context.Context, withShared bool) (*pb.Statistics, error) {
 
 func getInstanceCountByDomain(ctx context.Context, svcIDToNonVerKey map[string]string, resp chan datasource.GetInstanceCountByDomainResponse) {
 	ret := datasource.GetInstanceCountByDomainResponse{}
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
 	for sid := range svcIDToNonVerKey {
-		filter := mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(sid))
-		num, err := dao.CountInstance(ctx, filter)
+		num, err := CountInstance(ctx, sid)
 		if err != nil {
 			ret.Err = err
 			return