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/02/07 08:44:06 UTC

[servicecomb-service-center] branch master updated: [SCB-2094] Add cache heartbeat mode in mongo (#845) (#844)

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 2ce0b6c   [SCB-2094] Add cache heartbeat mode in mongo (#845) (#844)
2ce0b6c is described below

commit 2ce0b6c202bf23a92a412f442c148bd376ba0d2c
Author: robotLJW <79...@qq.com>
AuthorDate: Sun Feb 7 16:43:58 2021 +0800

     [SCB-2094] Add cache heartbeat mode in mongo (#845) (#844)
    
    * [SCB-2094] Add cache heartbeat mode in mongo
    
      * [SCB-2094] Modify the field containing info in struct
---
 datasource/mongo/bootstrap/bootstrap.go            |   3 +-
 datasource/mongo/database.go                       |  43 ++--
 datasource/mongo/dep.go                            |  58 ++---
 datasource/mongo/dependency_query.go               |  54 ++--
 datasource/mongo/engine.go                         |   2 +-
 datasource/mongo/event/instance_event_handler.go   |  14 +-
 .../mongo/event/instance_event_handler_test.go     |   4 +-
 datasource/mongo/heartbeat/cache/heartbeat.go      | 218 ++++++++++++++++
 datasource/mongo/heartbeat/cache/heartbeat_test.go | 137 ++++++++++
 datasource/mongo/heartbeat/cache/heartbeatcache.go | 115 +++++++++
 .../mongo/heartbeat/cache/heartbeatcache_test.go   |  86 +++++++
 .../{heartbeatchecker => checker}/heartbeat.go     |   6 +-
 .../heartbeat_test.go                              |  14 +-
 .../heartbeatchecker.go                            |   4 +-
 .../heartbeatchecker_test.go                       |  10 +-
 datasource/mongo/heartbeat/manager_test.go         |   4 +-
 datasource/mongo/mongo.go                          |  16 +-
 datasource/mongo/ms.go                             | 276 ++++++++++-----------
 datasource/mongo/rule_util.go                      |   2 +-
 datasource/mongo/sd/listwatch_inner.go             |   8 +-
 datasource/mongo/sd/listwatch_test.go              |   6 +-
 datasource/mongo/sd/mongo_cacher.go                |  12 +-
 datasource/mongo/sd/mongo_cacher_test.go           |   6 +-
 datasource/mongo/sd/types.go                       |  16 +-
 datasource/mongo/system.go                         |   6 +-
 datasource/mongo/util.go                           |   2 +-
 etc/conf/app.conf                                  |   2 -
 etc/conf/app.yaml                                  |  11 +
 test/test.go                                       |   2 +-
 29 files changed, 851 insertions(+), 286 deletions(-)

diff --git a/datasource/mongo/bootstrap/bootstrap.go b/datasource/mongo/bootstrap/bootstrap.go
index 1dc6119..47b4dcf 100644
--- a/datasource/mongo/bootstrap/bootstrap.go
+++ b/datasource/mongo/bootstrap/bootstrap.go
@@ -21,7 +21,8 @@ import (
 	_ "github.com/apache/servicecomb-service-center/datasource/mongo"
 
 	// heartbeat
-	_ "github.com/apache/servicecomb-service-center/datasource/mongo/heartbeat/heartbeatchecker"
+	_ "github.com/apache/servicecomb-service-center/datasource/mongo/heartbeat/cache"
+	_ "github.com/apache/servicecomb-service-center/datasource/mongo/heartbeat/checker"
 
 	// events
 	_ "github.com/apache/servicecomb-service-center/datasource/mongo/event"
diff --git a/datasource/mongo/database.go b/datasource/mongo/database.go
index f98f318..876ec33 100644
--- a/datasource/mongo/database.go
+++ b/datasource/mongo/database.go
@@ -44,7 +44,7 @@ const (
 	ColumnSchemaID            = "schemaid"
 	ColumnServiceID           = "serviceid"
 	ColumnRuleID              = "ruleid"
-	ColumnServiceInfo         = "serviceinfo"
+	ColumnService             = "service"
 	ColumnProperty            = "properties"
 	ColumnModTime             = "modtimestamp"
 	ColumnEnv                 = "env"
@@ -57,12 +57,12 @@ const (
 	ColumnPattern             = "pattern"
 	ColumnDescription         = "description"
 	ColumnRuleType            = "ruletype"
-	ColumnSchemaInfo          = "schemainfo"
+	ColumnSchema              = "schema"
 	ColumnSchemaSummary       = "schemasummary"
-	ColumnDepInfo             = "depinfo"
+	ColumnDep                 = "dep"
 	ColumnDependency          = "dependency"
-	ColumnRuleInfo            = "ruleinfo"
-	ColumnInstanceInfo        = "instanceinfo"
+	ColumnRule                = "rule"
+	ColumnInstance            = "instance"
 	ColumnInstanceID          = "instanceid"
 	ColumnConsumerID          = "consumerid"
 	ColumnMongoID             = "_id"
@@ -70,7 +70,6 @@ const (
 	ColumnServiceType         = "type"
 	ColumnServiceKey          = "servicekey"
 	ColumnConsumer            = "consumer"
-	ColumnDependencyInfo      = "dependencyinfo"
 	ColumnID                  = "id"
 	ColumnAccountName         = "name"
 	ColumnRoleName            = "name"
@@ -84,10 +83,10 @@ const (
 )
 
 type Service struct {
-	Domain      string
-	Project     string
-	Tags        map[string]string
-	ServiceInfo *pb.MicroService
+	Domain  string
+	Project string
+	Tags    map[string]string
+	Service *pb.MicroService
 }
 
 type Schema struct {
@@ -95,7 +94,7 @@ type Schema struct {
 	Project       string
 	ServiceID     string
 	SchemaID      string
-	SchemaInfo    string
+	Schema        string
 	SchemaSummary string
 }
 
@@ -103,22 +102,22 @@ type Rule struct {
 	Domain    string
 	Project   string
 	ServiceID string
-	RuleInfo  *pb.ServiceRule
+	Rule      *pb.ServiceRule
 }
 
 type Instance struct {
-	Domain       string
-	Project      string
-	RefreshTime  time.Time
-	InstanceInfo *pb.MicroServiceInstance
+	Domain      string
+	Project     string
+	RefreshTime time.Time
+	Instance    *pb.MicroServiceInstance
 }
 
 type ConsumerDep struct {
-	Domain          string
-	Project         string
-	ConsumerID      string
-	UUID            string
-	ConsumerDepInfo *pb.ConsumerDependency
+	Domain      string
+	Project     string
+	ConsumerID  string
+	UUID        string
+	ConsumerDep *pb.ConsumerDependency
 }
 
 type DependencyRule struct {
@@ -126,7 +125,7 @@ type DependencyRule struct {
 	Domain     string
 	Project    string
 	ServiceKey *pb.MicroServiceKey
-	DepInfo    *pb.MicroServiceDependency
+	Dep        *pb.MicroServiceDependency
 }
 
 type DelDepCacheKey struct {
diff --git a/datasource/mongo/dep.go b/datasource/mongo/dep.go
index 07634e6..1b0c600 100644
--- a/datasource/mongo/dep.go
+++ b/datasource/mongo/dep.go
@@ -54,11 +54,11 @@ func (ds *DataSource) SearchProviderDependency(ctx context.Context, request *dis
 		}, nil
 	}
 
-	dr := NewProviderDependencyRelation(ctx, domainProject, provider.ServiceInfo)
+	dr := NewProviderDependencyRelation(ctx, domainProject, provider.Service)
 	services, err := dr.GetDependencyConsumers(ToDependencyFilterOptions(request)...)
 	if err != nil {
 		log.Error(fmt.Sprintf("GetProviderDependencies failed, provider is %s/%s/%s/%s",
-			provider.ServiceInfo.Environment, provider.ServiceInfo.AppId, provider.ServiceInfo.ServiceName, provider.ServiceInfo.Version), err)
+			provider.Service.Environment, provider.Service.AppId, provider.Service.ServiceName, provider.Service.Version), err)
 		return &discovery.GetProDependenciesResponse{
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 		}, err
@@ -93,11 +93,11 @@ func (ds *DataSource) SearchConsumerDependency(ctx context.Context, request *dis
 		}, nil
 	}
 
-	dr := NewConsumerDependencyRelation(ctx, domainProject, consumer.ServiceInfo)
+	dr := NewConsumerDependencyRelation(ctx, domainProject, consumer.Service)
 	services, err := dr.GetDependencyProviders(ToDependencyFilterOptions(request)...)
 	if err != nil {
 		log.Error(fmt.Sprintf("query consumer failed, consumer is %s/%s/%s/%s",
-			consumer.ServiceInfo.Environment, consumer.ServiceInfo.AppId, consumer.ServiceInfo.ServiceName, consumer.ServiceInfo.Version), err)
+			consumer.Service.Environment, consumer.Service.AppId, consumer.Service.ServiceName, consumer.Service.Version), err)
 		return &discovery.GetConDependenciesResponse{
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 		}, err
@@ -109,16 +109,16 @@ func (ds *DataSource) SearchConsumerDependency(ctx context.Context, request *dis
 	}, nil
 }
 
-func (ds *DataSource) AddOrUpdateDependencies(ctx context.Context, dependencyInfos []*discovery.ConsumerDependency, override bool) (*discovery.Response, error) {
+func (ds *DataSource) AddOrUpdateDependencies(ctx context.Context, dependencys []*discovery.ConsumerDependency, override bool) (*discovery.Response, error) {
 	domainProject := util.ParseDomainProject(ctx)
-	for _, dependencyInfo := range dependencyInfos {
+	for _, dependency := range dependencys {
 		consumerFlag := util.StringJoin([]string{
-			dependencyInfo.Consumer.Environment,
-			dependencyInfo.Consumer.AppId,
-			dependencyInfo.Consumer.ServiceName,
-			dependencyInfo.Consumer.Version}, "/")
-		consumerInfo := discovery.DependenciesToKeys([]*discovery.MicroServiceKey{dependencyInfo.Consumer}, domainProject)[0]
-		providersInfo := discovery.DependenciesToKeys(dependencyInfo.Providers, domainProject)
+			dependency.Consumer.Environment,
+			dependency.Consumer.AppId,
+			dependency.Consumer.ServiceName,
+			dependency.Consumer.Version}, "/")
+		consumerInfo := discovery.DependenciesToKeys([]*discovery.MicroServiceKey{dependency.Consumer}, domainProject)[0]
+		providersInfo := discovery.DependenciesToKeys(dependency.Providers, domainProject)
 
 		rsp := datasource.ParamsChecker(consumerInfo, providersInfo)
 		if rsp != nil {
@@ -139,18 +139,18 @@ func (ds *DataSource) AddOrUpdateDependencies(ctx context.Context, dependencyInf
 			return discovery.CreateResponse(discovery.ErrServiceNotExists, fmt.Sprintf("Consumer %s does not exist.", consumerFlag)), nil
 		}
 
-		dependencyInfo.Override = override
+		dependency.Override = override
 		if !override {
 			id := util.GenerateUUID()
 
 			domain := util.ParseDomain(ctx)
 			project := util.ParseProject(ctx)
 			data := &ConsumerDep{
-				Domain:          domain,
-				Project:         project,
-				ConsumerID:      consumerID,
-				UUID:            id,
-				ConsumerDepInfo: dependencyInfo,
+				Domain:      domain,
+				Project:     project,
+				ConsumerID:  consumerID,
+				UUID:        id,
+				ConsumerDep: dependency,
 			}
 			insertRes, err := client.GetMongoClient().Insert(ctx, CollectionDep, data)
 			if err != nil {
@@ -159,7 +159,7 @@ func (ds *DataSource) AddOrUpdateDependencies(ctx context.Context, dependencyInf
 			}
 			log.Info(fmt.Sprintf("insert dep to mongodb success %s", insertRes.InsertedID))
 		}
-		err = syncDependencyRule(ctx, domainProject, dependencyInfo)
+		err = syncDependencyRule(ctx, domainProject, dependency)
 		if err != nil {
 			return nil, err
 		}
@@ -216,14 +216,14 @@ func GetOldProviderRules(dep *datasource.Dependency) (*discovery.MicroServiceDep
 	if err != nil {
 		return nil, err
 	}
-	return depRule.DepInfo, nil
+	return depRule.Dep, nil
 }
 
 func updateDeps(domainProject string, dep *datasource.Dependency) error {
 	var upsert = true
 	for _, r := range dep.DeleteDependencyRuleList {
 		filter := GenerateProviderDependencyRuleKey(domainProject, r)
-		_, err := client.GetMongoClient().Update(context.TODO(), CollectionDep, filter, bson.M{"$pull": bson.M{StringBuilder([]string{ColumnDepInfo, ColumnDependency}): dep.Consumer}})
+		_, err := client.GetMongoClient().Update(context.TODO(), CollectionDep, filter, bson.M{"$pull": bson.M{StringBuilder([]string{ColumnDep, ColumnDependency}): dep.Consumer}})
 		if err != nil {
 			return err
 		}
@@ -234,7 +234,7 @@ func updateDeps(domainProject string, dep *datasource.Dependency) error {
 	for _, r := range dep.CreateDependencyRuleList {
 		filter := GenerateProviderDependencyRuleKey(domainProject, r)
 		data := bson.M{
-			"$addToSet": bson.M{StringBuilder([]string{ColumnDepInfo, ColumnDependency}): dep.Consumer},
+			"$addToSet": bson.M{StringBuilder([]string{ColumnDep, ColumnDependency}): dep.Consumer},
 		}
 		_, err := client.GetMongoClient().Update(context.TODO(), CollectionDep, filter, data, &options.UpdateOptions{Upsert: &upsert})
 		if err != nil {
@@ -252,7 +252,7 @@ func updateDeps(domainProject string, dep *datasource.Dependency) error {
 		}
 	} else {
 		updateData := bson.M{
-			"$set": bson.M{StringBuilder([]string{ColumnDepInfo, ColumnDependency}): dep.ProvidersRule},
+			"$set": bson.M{StringBuilder([]string{ColumnDep, ColumnDependency}): dep.ProvidersRule},
 		}
 		_, err := client.GetMongoClient().Update(context.TODO(), CollectionDep, filter, updateData, &options.UpdateOptions{Upsert: &upsert})
 		if err != nil {
@@ -364,7 +364,7 @@ func removeProviderDeps(ctx context.Context, depRule *DependencyRule, cache map[
 
 func removeConsumerDeps(ctx context.Context, depRule *DependencyRule, cache map[*DelDepCacheKey]bool) (err error) {
 	var left []*discovery.MicroServiceKey
-	for _, key := range depRule.DepInfo.Dependency {
+	for _, key := range depRule.Dep.Dependency {
 		if key.ServiceName == "*" {
 			left = append(left, key)
 			continue
@@ -387,7 +387,7 @@ func removeConsumerDeps(ctx context.Context, depRule *DependencyRule, cache map[
 			left = append(left, key)
 		}
 	}
-	if len(depRule.DepInfo.Dependency) == len(left) {
+	if len(depRule.Dep.Dependency) == len(left) {
 		return nil
 	}
 
@@ -398,7 +398,7 @@ func removeConsumerDeps(ctx context.Context, depRule *DependencyRule, cache map[
 		_, err = client.GetMongoClient().DocDelete(ctx, CollectionDep, filter)
 	} else {
 		updateData := bson.M{
-			"$set": bson.M{StringBuilder([]string{ColumnDepInfo, ColumnDependency}): left},
+			"$set": bson.M{StringBuilder([]string{ColumnDep, ColumnDependency}): left},
 		}
 		_, err = client.GetMongoClient().Update(ctx, CollectionDep, filter, updateData)
 	}
@@ -422,7 +422,7 @@ func TransferToMicroServiceDependency(ctx context.Context, filter bson.M) (*disc
 		if err != nil {
 			return nil, err
 		}
-		microServiceDependency.Dependency = append(microServiceDependency.Dependency, depRule.DepInfo.Dependency...)
+		microServiceDependency.Dependency = append(microServiceDependency.Dependency, depRule.Dep.Dependency...)
 		return microServiceDependency, nil
 	}
 	return microServiceDependency, nil
@@ -442,7 +442,7 @@ func GetConsumerDepInfo(ctx context.Context, filter bson.M) ([]*discovery.Consum
 		if err != nil {
 			return nil, err
 		}
-		ConsumerDeps = append(ConsumerDeps, dep.ConsumerDepInfo)
+		ConsumerDeps = append(ConsumerDeps, dep.ConsumerDep)
 	}
 	return ConsumerDeps, nil
 }
@@ -464,7 +464,7 @@ func getServiceID(ctx context.Context, filter bson.M) (serviceID string, err err
 		return
 	}
 	if svc != nil {
-		serviceID = svc.ServiceInfo.ServiceId
+		serviceID = svc.Service.ServiceId
 		return
 	}
 	return
diff --git a/datasource/mongo/dependency_query.go b/datasource/mongo/dependency_query.go
index c245dbe..a83b35c 100644
--- a/datasource/mongo/dependency_query.go
+++ b/datasource/mongo/dependency_query.go
@@ -103,7 +103,7 @@ func (dr *DependencyRelation) GetDependencyProviders(opts ...DependencyRelationF
 			if op.NonSelf && providerID == dr.consumer.ServiceId {
 				continue
 			}
-			services = append(services, provider.ServiceInfo)
+			services = append(services, provider.Service)
 		}
 		if key.ServiceName == "*" {
 			break
@@ -197,8 +197,8 @@ func (dr *DependencyRelation) GetConsumerOfSameServiceNameAndAppID(provider *pb.
 				continue
 			}
 		}
-		if len(depRule.DepInfo.Dependency) > 0 {
-			allConsumers = append(allConsumers, depRule.DepInfo.Dependency...)
+		if len(depRule.Dep.Dependency) > 0 {
+			allConsumers = append(allConsumers, depRule.Dep.Dependency...)
 		}
 	}
 	return allConsumers, nil
@@ -244,8 +244,8 @@ func (dr *DependencyRelation) GetServiceByMicroServiceKey(service *pb.MicroServi
 		if err != nil {
 			return nil, err
 		}
-		if service.ServiceInfo != nil {
-			return service.ServiceInfo, nil
+		if service.Service != nil {
+			return service.Service, nil
 		}
 	}
 	return nil, nil
@@ -327,7 +327,7 @@ func (dr *DependencyRelation) parseDependencyRule(dependencyRule *pb.MicroServic
 			if err != nil {
 				return nil, err
 			}
-			serviceIDs = append(serviceIDs, service.ServiceInfo.ServiceId)
+			serviceIDs = append(serviceIDs, service.Service.ServiceId)
 		}
 	default:
 		serviceIDs, _, err = FindServiceIds(dr.ctx, dependencyRule.Version, dependencyRule)
@@ -366,10 +366,10 @@ func MicroServiceKeyFilter(key *pb.MicroServiceKey) (bson.M, error) {
 	return bson.M{
 		ColumnDomain:  tenant[0],
 		ColumnProject: tenant[1],
-		StringBuilder([]string{ColumnServiceInfo, ColumnEnv}):     key.Environment,
-		StringBuilder([]string{ColumnServiceInfo, ColumnAppID}):   key.AppId,
-		StringBuilder([]string{ColumnServiceInfo, ColumnAlias}):   key.Alias,
-		StringBuilder([]string{ColumnServiceInfo, ColumnVersion}): key.Version}, nil
+		StringBuilder([]string{ColumnService, ColumnEnv}):     key.Environment,
+		StringBuilder([]string{ColumnService, ColumnAppID}):   key.AppId,
+		StringBuilder([]string{ColumnService, ColumnAlias}):   key.Alias,
+		StringBuilder([]string{ColumnService, ColumnVersion}): key.Version}, nil
 }
 
 func RelyAllServiceKey(key *pb.MicroServiceKey) (bson.M, error) {
@@ -380,7 +380,7 @@ func RelyAllServiceKey(key *pb.MicroServiceKey) (bson.M, error) {
 	return bson.M{
 		ColumnDomain:  tenant[0],
 		ColumnProject: tenant[1],
-		StringBuilder([]string{ColumnServiceInfo, ColumnEnv}): key.Environment}, nil
+		StringBuilder([]string{ColumnService, ColumnEnv}): key.Environment}, nil
 }
 
 func FindServiceIds(ctx context.Context, versionRule string, key *pb.MicroServiceKey) ([]string, bool, error) {
@@ -396,8 +396,8 @@ func FindServiceIds(ctx context.Context, versionRule string, key *pb.MicroServic
 	baseFilter := bson.D{
 		{Key: ColumnDomain, Value: tenant[0]},
 		{Key: ColumnProject, Value: tenant[1]},
-		{Key: StringBuilder([]string{ColumnServiceInfo, ColumnEnv}), Value: key.Environment},
-		{Key: StringBuilder([]string{ColumnServiceInfo, ColumnAppID}), Value: key.AppId}}
+		{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: key.Environment},
+		{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: key.AppId}}
 
 	serviceIds, exist, err := findServiceKeysByServiceName(ctx, versionRule, key, baseFilter)
 	if err != nil {
@@ -444,13 +444,13 @@ func serviceVersionFilter(ctx context.Context, versionRule string, filter bson.D
 
 func findServiceKeysByServiceName(ctx context.Context, versionRule string, key *pb.MicroServiceKey, baseFilter bson.D) ([]string, bool, error) {
 	filter := append(baseFilter,
-		bson.E{Key: StringBuilder([]string{ColumnServiceInfo, ColumnServiceName}), Value: key.ServiceName})
+		bson.E{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: key.ServiceName})
 	return serviceVersionFilter(ctx, versionRule, filter)
 }
 
 func findServiceKeysByAlias(ctx context.Context, versionRule string, key *pb.MicroServiceKey, baseFilter bson.D) ([]string, bool, error) {
 	filter := append(baseFilter,
-		bson.E{Key: StringBuilder([]string{ColumnServiceInfo, ColumnAlias}), Value: key.Alias})
+		bson.E{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: key.Alias})
 	return serviceVersionFilter(ctx, versionRule, filter)
 }
 
@@ -463,15 +463,15 @@ func findServiceKeys(ctx context.Context, versionRule string, filter bson.D) (fi
 		return GetVersionServiceLatest, filter
 	case versionRule[len(versionRule)-1:] == "+":
 		start := versionRule[:len(versionRule)-1]
-		filter = append(filter, bson.E{Key: StringBuilder([]string{ColumnServiceInfo, ColumnVersion}), Value: bson.M{"$gte": start}})
+		filter = append(filter, bson.E{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bson.M{"$gte": start}})
 		return GetVersionService, filter
 	case rangeIdx > 0:
 		start := versionRule[:rangeIdx]
 		end := versionRule[rangeIdx+1:]
-		filter = append(filter, bson.E{Key: StringBuilder([]string{ColumnServiceInfo, ColumnVersion}), Value: bson.M{"$gte": start, "$lt": end}})
+		filter = append(filter, bson.E{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bson.M{"$gte": start, "$lt": end}})
 		return GetVersionService, filter
 	default:
-		filter = append(filter, bson.E{Key: StringBuilder([]string{ColumnServiceInfo, ColumnVersion}), Value: versionRule})
+		filter = append(filter, bson.E{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: versionRule})
 		return nil, filter
 	}
 }
@@ -479,7 +479,7 @@ func findServiceKeys(ctx context.Context, versionRule string, filter bson.D) (fi
 func GetVersionServiceLatest(ctx context.Context, m bson.D) (serviceIds []string, err error) {
 	findRes, err := client.GetMongoClient().Find(ctx, CollectionService, m,
 		&options.FindOptions{
-			Sort: bson.M{StringBuilder([]string{ColumnServiceInfo, ColumnVersion}): -1}})
+			Sort: bson.M{StringBuilder([]string{ColumnService, ColumnVersion}): -1}})
 	if err != nil {
 		return nil, err
 	}
@@ -492,7 +492,7 @@ func GetVersionServiceLatest(ctx context.Context, m bson.D) (serviceIds []string
 		if err != nil {
 			return
 		}
-		serviceIds = append(serviceIds, service.ServiceInfo.ServiceId)
+		serviceIds = append(serviceIds, service.Service.ServiceId)
 		if serviceIds != nil {
 			return
 		}
@@ -502,7 +502,7 @@ func GetVersionServiceLatest(ctx context.Context, m bson.D) (serviceIds []string
 
 func GetVersionService(ctx context.Context, m bson.D) (serviceIds []string, err error) {
 	findRes, err := client.GetMongoClient().Find(ctx, CollectionService, m, &options.FindOptions{
-		Sort: bson.M{StringBuilder([]string{ColumnServiceInfo, ColumnVersion}): -1}})
+		Sort: bson.M{StringBuilder([]string{ColumnService, ColumnVersion}): -1}})
 	if err != nil {
 		return
 	}
@@ -515,7 +515,7 @@ func GetVersionService(ctx context.Context, m bson.D) (serviceIds []string, err
 		if err != nil {
 			return
 		}
-		serviceIds = append(serviceIds, service.ServiceInfo.ServiceId)
+		serviceIds = append(serviceIds, service.Service.ServiceId)
 	}
 	return
 }
@@ -541,7 +541,7 @@ func ParseVersionRule(ctx context.Context, versionRule string, key *pb.MicroServ
 		filter := bson.M{
 			ColumnDomain:  tenant[0],
 			ColumnProject: tenant[1],
-			StringBuilder([]string{ColumnServiceInfo, ColumnVersion}): bson.M{"$gte": start}}
+			StringBuilder([]string{ColumnService, ColumnVersion}): bson.M{"$gte": start}}
 		return GetFilterVersionService(ctx, filter)
 	case rangeIdx > 0:
 		start := versionRule[:rangeIdx]
@@ -549,7 +549,7 @@ func ParseVersionRule(ctx context.Context, versionRule string, key *pb.MicroServ
 		filter := bson.M{
 			ColumnDomain:  tenant[0],
 			ColumnProject: tenant[1],
-			StringBuilder([]string{ColumnServiceInfo, ColumnVersion}): bson.M{"$gte": start, "$lte": end}}
+			StringBuilder([]string{ColumnService, ColumnVersion}): bson.M{"$gte": start, "$lte": end}}
 		return GetFilterVersionService(ctx, filter)
 	default:
 		return nil, nil
@@ -570,7 +570,7 @@ func GetFilterVersionService(ctx context.Context, m bson.M) (serviceIDs []string
 		if err != nil {
 			return nil, err
 		}
-		serviceIDs = append(serviceIDs, service.ServiceInfo.ServiceId)
+		serviceIDs = append(serviceIDs, service.Service.ServiceId)
 	}
 	return
 }
@@ -578,7 +578,7 @@ func GetFilterVersionService(ctx context.Context, m bson.M) (serviceIDs []string
 func GetFilterVersionServiceLatest(ctx context.Context, m bson.M) (serviceIDs []string, err error) {
 	findRes, err := client.GetMongoClient().Find(ctx, CollectionService, m,
 		&options.FindOptions{
-			Sort: bson.M{StringBuilder([]string{ColumnServiceInfo, ColumnVersion}): -1}})
+			Sort: bson.M{StringBuilder([]string{ColumnService, ColumnVersion}): -1}})
 	if err != nil {
 		return nil, err
 	}
@@ -591,7 +591,7 @@ func GetFilterVersionServiceLatest(ctx context.Context, m bson.M) (serviceIDs []
 		if err != nil {
 			return nil, err
 		}
-		serviceIDs = append(serviceIDs, service.ServiceInfo.ServiceId)
+		serviceIDs = append(serviceIDs, service.Service.ServiceId)
 		if serviceIDs != nil {
 			return serviceIDs, nil
 		}
diff --git a/datasource/mongo/engine.go b/datasource/mongo/engine.go
index e7b799a..07bca41 100644
--- a/datasource/mongo/engine.go
+++ b/datasource/mongo/engine.go
@@ -216,7 +216,7 @@ func GetAllServicesAcrossDomainProject(ctx context.Context) (map[string][]*pb.Mi
 			return nil, err
 		}
 		domainProject := mongoService.Domain + "/" + mongoService.Project
-		services[domainProject] = append(services[domainProject], mongoService.ServiceInfo)
+		services[domainProject] = append(services[domainProject], mongoService.Service)
 	}
 	return services, nil
 }
diff --git a/datasource/mongo/event/instance_event_handler.go b/datasource/mongo/event/instance_event_handler.go
index c11328c..75b846f 100644
--- a/datasource/mongo/event/instance_event_handler.go
+++ b/datasource/mongo/event/instance_event_handler.go
@@ -49,13 +49,13 @@ func (h InstanceEventHandler) Type() string {
 func (h InstanceEventHandler) OnEvent(evt sd.MongoEvent) {
 	action := evt.Type
 	instance := evt.Value.(sd.Instance)
-	providerID := instance.InstanceInfo.ServiceId
-	providerInstanceID := instance.InstanceInfo.InstanceId
+	providerID := instance.Instance.ServiceId
+	providerInstanceID := instance.Instance.InstanceId
 	domainProject := instance.Domain + "/" + instance.Project
 	cacheService := sd.Store().Service().Cache().Get(providerID)
 	var microService *discovery.MicroService
 	if cacheService != nil {
-		microService = cacheService.(sd.Service).ServiceInfo
+		microService = cacheService.(sd.Service).Service
 	}
 	if microService == nil {
 		log.Info("get cached service failed, then get from database")
@@ -68,10 +68,10 @@ func (h InstanceEventHandler) OnEvent(evt sd.MongoEvent) {
 			}
 			return
 		}
-		microService = service.ServiceInfo // service in the cache may not ready, query from db once
+		microService = service.Service // service in the cache may not ready, query from db once
 		if microService == nil {
 			log.Warn(fmt.Sprintf("caught [%s] instance[%s/%s] event, endpoints %v, get provider's file failed from db\n",
-				action, providerID, providerInstanceID, instance.InstanceInfo.Endpoints))
+				action, providerID, providerInstanceID, instance.Instance.Endpoints))
 			return
 		}
 	}
@@ -100,7 +100,7 @@ func PublishInstanceEvent(evt sd.MongoEvent, domainProject string, serviceKey *d
 		Response: discovery.CreateResponse(discovery.ResponseSuccess, "Watch instance successfully."),
 		Action:   string(evt.Type),
 		Key:      serviceKey,
-		Instance: evt.Value.(sd.Instance).InstanceInfo,
+		Instance: evt.Value.(sd.Instance).Instance,
 	}
 	for _, consumerID := range subscribers {
 		evt := notify.NewInstanceEventWithTime(consumerID, domainProject, -1, simple.FromTime(time.Now()), response)
@@ -112,7 +112,7 @@ func PublishInstanceEvent(evt sd.MongoEvent, domainProject string, serviceKey *d
 }
 
 func NotifySyncerInstanceEvent(event sd.MongoEvent, microService *discovery.MicroService) {
-	instance := event.Value.(sd.Instance).InstanceInfo
+	instance := event.Value.(sd.Instance).Instance
 	log.Info(fmt.Sprintf("instanceId : %s and serviceId : %s in NotifySyncerInstanceEvent", instance.InstanceId, instance.ServiceId))
 	instanceKey := util.StringJoin([]string{datasource.InstanceKeyPrefix, event.Value.(sd.Instance).Domain,
 		event.Value.(sd.Instance).Project, instance.ServiceId, instance.InstanceId}, datasource.SPLIT)
diff --git a/datasource/mongo/event/instance_event_handler_test.go b/datasource/mongo/event/instance_event_handler_test.go
index 5f0e168..798afc1 100644
--- a/datasource/mongo/event/instance_event_handler_test.go
+++ b/datasource/mongo/event/instance_event_handler_test.go
@@ -67,7 +67,7 @@ func mongoAssign() sd.MongoEvent {
 		Endpoints:  endPoints,
 	}
 	mongoInstance := sd.Instance{}
-	mongoInstance.InstanceInfo = &instance
+	mongoInstance.Instance = &instance
 	mongoInstance.Domain = "default"
 	mongoInstance.Project = "default"
 	mongoEvent := sd.MongoEvent{}
@@ -87,7 +87,7 @@ func mongoEventWronServiceId() sd.MongoEvent {
 		Endpoints:  endPoints,
 	}
 	mongoInstance := sd.Instance{}
-	mongoInstance.InstanceInfo = &instance
+	mongoInstance.Instance = &instance
 	mongoInstance.Domain = "default"
 	mongoInstance.Project = "default"
 	mongoEvent := sd.MongoEvent{}
diff --git a/datasource/mongo/heartbeat/cache/heartbeat.go b/datasource/mongo/heartbeat/cache/heartbeat.go
new file mode 100644
index 0000000..159d8c9
--- /dev/null
+++ b/datasource/mongo/heartbeat/cache/heartbeat.go
@@ -0,0 +1,218 @@
+/*
+ * 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 request compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to request writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package heartbeatcache
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"runtime"
+	"time"
+
+	"github.com/patrickmn/go-cache"
+	"go.mongodb.org/mongo-driver/bson"
+
+	"github.com/apache/servicecomb-service-center/datasource/mongo"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+	"github.com/apache/servicecomb-service-center/pkg/gopool"
+	"github.com/apache/servicecomb-service-center/pkg/log"
+	"github.com/apache/servicecomb-service-center/server/config"
+)
+
+const (
+	defaultTTL              = 30
+	defaultCacheCapacity    = 10000
+	defaultWorkNum          = 10
+	defaultTimeout          = 10
+	instanceCheckerInternal = 1 * time.Second
+	ctxTimeout              = 5 * time.Second
+)
+
+// Store cache structure
+type instanceHeartbeatInfo struct {
+	serviceID   string
+	instanceID  string
+	ttl         int32
+	lastRefresh time.Time
+}
+
+var (
+	cacheChan              chan *instanceHeartbeatInfo
+	instanceHeartbeatStore = cache.New(0, instanceCheckerInternal)
+	workerNum              = runtime.NumCPU()
+	heartbeatTaskTimeout   = config.GetInt("registry.mongo.heartbeat.timeout", defaultTimeout)
+	ErrHeartbeatTimeout    = errors.New("heartbeat task waiting for processing timeout. ")
+)
+
+func init() {
+	capacity := config.GetInt("registry.mongo.heartbeat.cacheCapacity", defaultCacheCapacity)
+	cacheChan = make(chan *instanceHeartbeatInfo, capacity)
+	num := config.GetInt("registry.mongo.heartbeat.workerNum", defaultWorkNum)
+	if num != 0 {
+		workerNum = num
+	}
+	instanceHeartbeatStore.OnEvicted(func(k string, v interface{}) {
+		instanceInfo, ok := v.(*instanceHeartbeatInfo)
+		if ok && instanceInfo != nil {
+			ctx, cancel := context.WithTimeout(context.Background(), ctxTimeout)
+			defer cancel()
+			err := cleanInstance(ctx, instanceInfo.serviceID, instanceInfo.instanceID)
+			if err != nil {
+				log.Error("failed to cleanInstance in mongodb.", err)
+			}
+		}
+	})
+
+	for i := 1; i <= workerNum; i++ {
+		gopool.Go(func(ctx context.Context) {
+			for {
+				select {
+				case <-ctx.Done():
+					log.Warn("heartbeat work protocol exit.")
+					return
+				case heartbeatInfo, ok := <-cacheChan:
+					if ok {
+						instanceHeartbeatStore.Set(heartbeatInfo.instanceID, heartbeatInfo, time.Duration(heartbeatInfo.ttl)*time.Second)
+					}
+				}
+			}
+		})
+	}
+}
+
+func addHeartbeatTask(serviceID string, instanceID string, ttl int32) error {
+	// Unassigned setting default value is 30s
+	if ttl <= 0 {
+		ttl = defaultTTL
+	}
+	newInstance := &instanceHeartbeatInfo{
+		serviceID:   serviceID,
+		instanceID:  instanceID,
+		ttl:         ttl,
+		lastRefresh: time.Now(),
+	}
+	select {
+	case cacheChan <- newInstance:
+		return nil
+	case <-time.After(time.Duration(heartbeatTaskTimeout) * time.Second):
+		log.Warn("the heartbeat's channel is full. ")
+		return ErrHeartbeatTimeout
+	}
+}
+
+func RemoveCacheInstance(instanceID string) {
+	instanceHeartbeatStore.Delete(instanceID)
+}
+
+func cleanInstance(ctx context.Context, serviceID string, instanceID string) error {
+	session, err := client.GetMongoClient().StartSession(ctx)
+	if err != nil {
+		return err
+	}
+	if err = session.StartTransaction(); err != nil {
+		return err
+	}
+	defer session.EndSession(ctx)
+
+	filter := bson.M{
+		mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnServiceID}):  serviceID,
+		mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnInstanceID}): instanceID,
+	}
+
+	result, err := client.GetMongoClient().FindOne(ctx, mongo.CollectionInstance, filter)
+	if err != nil {
+		log.Error("failed to query instance: %v", err)
+		return err
+	}
+	var ins mongo.Instance
+	err = result.Decode(&ins)
+	if err != nil {
+		log.Error("decode instance failed: %v", err)
+		return err
+	}
+	ttl := ins.Instance.HealthCheck.Interval * (ins.Instance.HealthCheck.Times + 1)
+	if ttl <= 0 {
+		ttl = defaultTTL
+	}
+	if isOutDate(ins.RefreshTime, ttl) {
+		return nil
+	}
+	err = removeDBInstance(ctx, ins.Instance.ServiceId, ins.Instance.InstanceId)
+	if err != nil {
+		log.Error("fail to remote instance in db: %v", err)
+		errAbort := session.AbortTransaction(ctx)
+		if errAbort != nil {
+			return errAbort
+		}
+		return err
+	}
+	err = session.CommitTransaction(ctx)
+	return err
+}
+
+func removeDBInstance(ctx context.Context, serviceID string, instanceID string) error {
+	filter := bson.M{
+		mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnServiceID}):  serviceID,
+		mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnInstanceID}): instanceID,
+	}
+	res, err := client.GetMongoClient().DeleteOne(ctx, mongo.CollectionInstance, filter)
+	if err != nil {
+		log.Error("failed to clean instance", err)
+		return err
+	}
+	log.Info(fmt.Sprintf("delete from mongodb:%+v", res))
+	return nil
+}
+
+func findInstance(ctx context.Context, serviceID string, instanceID string) (*mongo.Instance, error) {
+	filter := bson.M{
+		mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnServiceID}):  serviceID,
+		mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnInstanceID}): instanceID,
+	}
+	result, err := client.GetMongoClient().FindOne(ctx, mongo.CollectionInstance, filter)
+	if err != nil {
+		return nil, err
+	}
+	var ins mongo.Instance
+	err = result.Decode(&ins)
+	if err != nil {
+		log.Error("decode instance failed: ", err)
+		return nil, err
+	}
+	return &ins, nil
+}
+
+func updateInstance(ctx context.Context, serviceID string, instanceID string) error {
+	filter := bson.M{
+		mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnServiceID}):  serviceID,
+		mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnInstanceID}): instanceID,
+	}
+	update := bson.M{
+		"$set": bson.M{mongo.ColumnRefreshTime: time.Now()},
+	}
+	result, err := client.GetMongoClient().FindOneAndUpdate(ctx, mongo.CollectionInstance, filter, update)
+	if err != nil {
+		log.Error("failed to update refresh time of instance: ", err)
+		return err
+	}
+	return result.Err()
+}
+
+func isOutDate(refreshTime time.Time, ttl int32) bool {
+	return time.Since(refreshTime) <= time.Duration(ttl)*time.Second
+}
diff --git a/datasource/mongo/heartbeat/cache/heartbeat_test.go b/datasource/mongo/heartbeat/cache/heartbeat_test.go
new file mode 100644
index 0000000..6d7670c
--- /dev/null
+++ b/datasource/mongo/heartbeat/cache/heartbeat_test.go
@@ -0,0 +1,137 @@
+/*
+ * 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 request compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to request writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package heartbeatcache
+
+import (
+	_ "github.com/apache/servicecomb-service-center/server/init"
+)
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	pb "github.com/go-chassis/cari/discovery"
+	"github.com/go-chassis/go-chassis/v2/storage"
+	"github.com/stretchr/testify/assert"
+
+	"github.com/apache/servicecomb-service-center/datasource/mongo"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+)
+
+func init() {
+	config := storage.Options{
+		URI: "mongodb://localhost:27017",
+	}
+	client.NewMongoClient(config)
+}
+
+func TestAddCacheInstance(t *testing.T) {
+	t.Run("add cache instance: set the ttl to 2 seconds", func(t *testing.T) {
+		instance1 := mongo.Instance{
+			RefreshTime: time.Now(),
+			Instance: &pb.MicroServiceInstance{
+				InstanceId: "instanceID1",
+				ServiceId:  "serviceID1",
+				HealthCheck: &pb.HealthCheck{
+					Interval: 1,
+					Times:    1,
+				},
+			},
+		}
+		err := addHeartbeatTask(instance1.Instance.ServiceId, instance1.Instance.InstanceId, instance1.Instance.HealthCheck.Interval*(instance1.Instance.HealthCheck.Times+1))
+		assert.Equal(t, nil, err)
+		_, err = client.GetMongoClient().Insert(context.Background(), mongo.CollectionInstance, instance1)
+		assert.Equal(t, nil, err)
+		info, ok := instanceHeartbeatStore.Get(instance1.Instance.InstanceId)
+		assert.Equal(t, true, ok)
+		if ok {
+			heartBeatInfo := info.(*instanceHeartbeatInfo)
+			assert.Equal(t, instance1.Instance.InstanceId, heartBeatInfo.instanceID)
+			assert.Equal(t, instance1.Instance.HealthCheck.Interval*(instance1.Instance.HealthCheck.Times+1), heartBeatInfo.ttl)
+		}
+		time.Sleep(2 * time.Second)
+		_, ok = instanceHeartbeatStore.Get(instance1.Instance.InstanceId)
+		assert.Equal(t, false, ok)
+		_, err = client.GetMongoClient().Delete(context.Background(), mongo.CollectionInstance, instance1)
+		assert.Equal(t, nil, err)
+	})
+
+	t.Run("add cache instance: do not set interval time", func(t *testing.T) {
+		instance1 := mongo.Instance{
+			RefreshTime: time.Now(),
+			Instance: &pb.MicroServiceInstance{
+				InstanceId: "instanceID1",
+				ServiceId:  "serviceID1",
+				HealthCheck: &pb.HealthCheck{
+					Interval: 0,
+					Times:    0,
+				},
+			},
+		}
+		err := addHeartbeatTask(instance1.Instance.ServiceId, instance1.Instance.InstanceId, instance1.Instance.HealthCheck.Interval*(instance1.Instance.HealthCheck.Times+1))
+		assert.Equal(t, nil, err)
+		_, err = client.GetMongoClient().Insert(context.Background(), mongo.CollectionInstance, instance1)
+		assert.Equal(t, nil, err)
+		info, ok := instanceHeartbeatStore.Get(instance1.Instance.InstanceId)
+		assert.Equal(t, true, ok)
+		if ok {
+			heartBeatInfo := info.(*instanceHeartbeatInfo)
+			assert.Equal(t, instance1.Instance.InstanceId, heartBeatInfo.instanceID)
+			assert.Equal(t, int32(defaultTTL), heartBeatInfo.ttl)
+		}
+		time.Sleep(defaultTTL * time.Second)
+		_, ok = instanceHeartbeatStore.Get(instance1.Instance.InstanceId)
+		assert.Equal(t, false, ok)
+		_, err = client.GetMongoClient().Delete(context.Background(), mongo.CollectionInstance, instance1)
+		assert.Equal(t, nil, err)
+	})
+}
+
+func TestRemoveCacheInstance(t *testing.T) {
+	t.Run("remove cache instance: the instance has cache and can be deleted successfully", func(t *testing.T) {
+		instance1 := mongo.Instance{
+			RefreshTime: time.Now(),
+			Instance: &pb.MicroServiceInstance{
+				InstanceId: "instanceID1",
+				ServiceId:  "serviceID1",
+				HealthCheck: &pb.HealthCheck{
+					Interval: 3,
+					Times:    1,
+				},
+			},
+		}
+		err := addHeartbeatTask(instance1.Instance.ServiceId, instance1.Instance.InstanceId, instance1.Instance.HealthCheck.Interval*(instance1.Instance.HealthCheck.Times+1))
+		assert.Equal(t, nil, err)
+		_, err = client.GetMongoClient().Insert(context.Background(), mongo.CollectionInstance, instance1)
+		assert.Equal(t, nil, err)
+		info, ok := instanceHeartbeatStore.Get(instance1.Instance.InstanceId)
+		assert.Equal(t, true, ok)
+		if ok {
+			heartBeatInfo := info.(*instanceHeartbeatInfo)
+			assert.Equal(t, instance1.Instance.InstanceId, heartBeatInfo.instanceID)
+			assert.Equal(t, instance1.Instance.HealthCheck.Interval*(instance1.Instance.HealthCheck.Times+1), heartBeatInfo.ttl)
+		}
+		time.Sleep(4 * time.Second)
+		RemoveCacheInstance(instance1.Instance.InstanceId)
+		_, ok = instanceHeartbeatStore.Get(instance1.Instance.InstanceId)
+		assert.Equal(t, false, ok)
+		_, err = client.GetMongoClient().Delete(context.Background(), mongo.CollectionInstance, instance1)
+		assert.Equal(t, nil, err)
+	})
+}
diff --git a/datasource/mongo/heartbeat/cache/heartbeatcache.go b/datasource/mongo/heartbeat/cache/heartbeatcache.go
new file mode 100644
index 0000000..46588e9
--- /dev/null
+++ b/datasource/mongo/heartbeat/cache/heartbeatcache.go
@@ -0,0 +1,115 @@
+/*
+ * 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 heartbeatcache
+
+import (
+	"context"
+	"errors"
+	"fmt"
+
+	pb "github.com/go-chassis/cari/discovery"
+
+	"github.com/apache/servicecomb-service-center/datasource/mongo/heartbeat"
+	"github.com/apache/servicecomb-service-center/pkg/log"
+	"github.com/apache/servicecomb-service-center/pkg/util"
+)
+
+var ErrHeartbeatConversionFailed = errors.New("instanceHeartbeatInfo type conversion failed. ")
+
+func init() {
+	heartbeat.Install("cache", NewHeartBeatCheck)
+}
+
+type HeartBeatCheck struct {
+}
+
+func NewHeartBeatCheck(opts heartbeat.Options) (heartbeat.HealthCheck, error) {
+	return &HeartBeatCheck{}, nil
+}
+
+func (h *HeartBeatCheck) Heartbeat(ctx context.Context, request *pb.HeartbeatRequest) (*pb.HeartbeatResponse, error) {
+	if ins, ok := instanceHeartbeatStore.Get(request.InstanceId); ok {
+		return inCacheStrategy(ctx, request, ins)
+	} else {
+		return notInCacheStrategy(ctx, request)
+	}
+}
+
+func inCacheStrategy(ctx context.Context, request *pb.HeartbeatRequest, insHeartbeatInfo interface{}) (*pb.HeartbeatResponse, error) {
+	remoteIP := util.GetIPFromContext(ctx)
+	heartbeatInfo, ok := insHeartbeatInfo.(*instanceHeartbeatInfo)
+	if !ok {
+		log.Error("type conversion failed: %v", ErrHeartbeatConversionFailed)
+		resp := &pb.HeartbeatResponse{
+			Response: pb.CreateResponseWithSCErr(pb.NewError(pb.ErrInstanceNotExists, ErrHeartbeatConversionFailed.Error())),
+		}
+		return resp, ErrHeartbeatConversionFailed
+	}
+	err := addHeartbeatTask(request.ServiceId, request.InstanceId, heartbeatInfo.ttl)
+	if err != nil {
+		log.Error(fmt.Sprintf("heartbeat failed, instance[%s]. operator %s", request.InstanceId, remoteIP), err)
+		resp := &pb.HeartbeatResponse{
+			Response: pb.CreateResponseWithSCErr(pb.NewError(pb.ErrNotEnoughQuota, err.Error())),
+		}
+		return resp, err
+	}
+	err = updateInstance(ctx, request.ServiceId, request.InstanceId)
+	if err != nil {
+		log.Error(fmt.Sprintf("heartbeat failed, instance[%s]. operator %s", request.InstanceId, remoteIP), err)
+		resp := &pb.HeartbeatResponse{
+			Response: pb.CreateResponseWithSCErr(pb.NewError(pb.ErrInstanceNotExists, err.Error())),
+		}
+		return resp, err
+	}
+	return &pb.HeartbeatResponse{
+		Response: pb.CreateResponse(pb.ResponseSuccess, "update service instance heartbeat successfully"),
+	}, nil
+}
+
+func notInCacheStrategy(ctx context.Context, request *pb.HeartbeatRequest) (*pb.HeartbeatResponse, error) {
+	remoteIP := util.GetIPFromContext(ctx)
+	instance, err := findInstance(ctx, request.ServiceId, request.InstanceId)
+	if err != nil {
+		log.Error(fmt.Sprintf("heartbeat failed, instance[%s]. operator %s", request.InstanceId, remoteIP), err)
+		resp := &pb.HeartbeatResponse{
+			Response: pb.CreateResponseWithSCErr(pb.NewError(pb.ErrInstanceNotExists, err.Error())),
+		}
+		return resp, err
+	}
+	interval, times := instance.Instance.HealthCheck.Interval, instance.Instance.HealthCheck.Times
+	err = addHeartbeatTask(request.ServiceId, request.InstanceId, interval*(times+1))
+	if err != nil {
+		log.Error(fmt.Sprintf("heartbeat failed, instance[%s]. operator %s", request.InstanceId, remoteIP), err)
+		resp := &pb.HeartbeatResponse{
+			Response: pb.CreateResponseWithSCErr(pb.NewError(pb.ErrNotEnoughQuota, err.Error())),
+		}
+		return resp, err
+	}
+	err = updateInstance(ctx, request.ServiceId, request.InstanceId)
+	if err != nil {
+		RemoveCacheInstance(request.InstanceId)
+		log.Error(fmt.Sprintf("heartbeat failed, instance[%s]. operator %s", request.InstanceId, remoteIP), err)
+		resp := &pb.HeartbeatResponse{
+			Response: pb.CreateResponseWithSCErr(pb.NewError(pb.ErrInstanceNotExists, err.Error())),
+		}
+		return resp, err
+	}
+	return &pb.HeartbeatResponse{
+		Response: pb.CreateResponse(pb.ResponseSuccess, "update service instance heartbeat successfully"),
+	}, nil
+}
diff --git a/datasource/mongo/heartbeat/cache/heartbeatcache_test.go b/datasource/mongo/heartbeat/cache/heartbeatcache_test.go
new file mode 100644
index 0000000..58980d6
--- /dev/null
+++ b/datasource/mongo/heartbeat/cache/heartbeatcache_test.go
@@ -0,0 +1,86 @@
+/*
+ * 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 request compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to request writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package heartbeatcache
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	pb "github.com/go-chassis/cari/discovery"
+	"github.com/stretchr/testify/assert"
+	"go.mongodb.org/mongo-driver/bson"
+
+	"github.com/apache/servicecomb-service-center/datasource/mongo"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+)
+
+func TestHeartBeatCheck(t *testing.T) {
+	t.Run("heartbeat check: instance does not exist,it should be failed", func(t *testing.T) {
+		heartBeatCheck := &HeartBeatCheck{}
+		resp, err := heartBeatCheck.Heartbeat(context.Background(), &pb.HeartbeatRequest{
+			ServiceId:  "serviceId1",
+			InstanceId: "not-exist-ins",
+		})
+		assert.NotNil(t, err)
+		assert.NotEqual(t, pb.ResponseSuccess, resp.Response.GetCode())
+	})
+
+	t.Run("heartbeat check: data exists in the cache,but not in db,it should be failed", func(t *testing.T) {
+		err := addHeartbeatTask("not-exist-svc", "not-exist-ins", 30)
+		assert.Nil(t, err)
+		heartBeatCheck := &HeartBeatCheck{}
+		resp, err := heartBeatCheck.Heartbeat(context.Background(), &pb.HeartbeatRequest{
+			ServiceId:  "serviceId1",
+			InstanceId: "not-exist-ins",
+		})
+		assert.NotNil(t, err)
+		assert.NotEqual(t, pb.ResponseSuccess, resp.Response.GetCode())
+	})
+
+	t.Run("heartbeat check: data exists in the cache and db,it can be update successfully", func(t *testing.T) {
+		heartBeatCheck := &HeartBeatCheck{}
+		instanceDB := mongo.Instance{
+			RefreshTime: time.Now(),
+			Instance: &pb.MicroServiceInstance{
+				InstanceId: "instanceIdDB",
+				ServiceId:  "serviceIdDB",
+				HealthCheck: &pb.HealthCheck{
+					Interval: 1,
+					Times:    1,
+				},
+			},
+		}
+		filter := bson.M{
+			mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnInstanceID}): instanceDB.Instance.InstanceId,
+		}
+		_, _ = client.GetMongoClient().Delete(context.Background(), mongo.CollectionInstance, filter)
+		_, err := client.GetMongoClient().Insert(context.Background(), mongo.CollectionInstance, instanceDB)
+		assert.Equal(t, nil, err)
+		err = addHeartbeatTask(instanceDB.Instance.ServiceId, instanceDB.Instance.InstanceId, instanceDB.Instance.HealthCheck.Interval*(instanceDB.Instance.HealthCheck.Times+1))
+		assert.Equal(t, nil, err)
+		resp, err := heartBeatCheck.Heartbeat(context.Background(), &pb.HeartbeatRequest{
+			ServiceId:  "serviceIdDB",
+			InstanceId: "instanceIdDB",
+		})
+		assert.Nil(t, err)
+		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
+		_, err = client.GetMongoClient().Delete(context.Background(), mongo.CollectionInstance, filter)
+		assert.Nil(t, err)
+	})
+}
diff --git a/datasource/mongo/heartbeat/heartbeatchecker/heartbeat.go b/datasource/mongo/heartbeat/checker/heartbeat.go
similarity index 87%
rename from datasource/mongo/heartbeat/heartbeatchecker/heartbeat.go
rename to datasource/mongo/heartbeat/checker/heartbeat.go
index c5113df..fc949a2 100644
--- a/datasource/mongo/heartbeat/heartbeatchecker/heartbeat.go
+++ b/datasource/mongo/heartbeat/checker/heartbeat.go
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package heartbeatchecker
+package checker
 
 import (
 	"context"
@@ -30,8 +30,8 @@ import (
 
 func updateInstanceRefreshTime(ctx context.Context, serviceID string, instanceID string) error {
 	filter := bson.M{
-		mongo.StringBuilder([]string{mongo.ColumnInstanceInfo, mongo.ColumnServiceID}):  serviceID,
-		mongo.StringBuilder([]string{mongo.ColumnInstanceInfo, mongo.ColumnInstanceID}): instanceID,
+		mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnServiceID}):  serviceID,
+		mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnInstanceID}): instanceID,
 	}
 	update := bson.M{
 		"$set": bson.M{mongo.ColumnRefreshTime: time.Now()},
diff --git a/datasource/mongo/heartbeat/heartbeatchecker/heartbeat_test.go b/datasource/mongo/heartbeat/checker/heartbeat_test.go
similarity index 80%
rename from datasource/mongo/heartbeat/heartbeatchecker/heartbeat_test.go
rename to datasource/mongo/heartbeat/checker/heartbeat_test.go
index 5c6c35f..696203c 100644
--- a/datasource/mongo/heartbeat/heartbeatchecker/heartbeat_test.go
+++ b/datasource/mongo/heartbeat/checker/heartbeat_test.go
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package heartbeatchecker
+package checker
 
 import (
 	"context"
@@ -49,18 +49,18 @@ func TestUpdateInstanceRefreshTime(t *testing.T) {
 	t.Run("update instance refresh time: if the instance does exist,the update should succeed", func(t *testing.T) {
 		instance1 := mongo.Instance{
 			RefreshTime: time.Now(),
-			InstanceInfo: &pb.MicroServiceInstance{
+			Instance: &pb.MicroServiceInstance{
 				InstanceId: "instanceId1",
 				ServiceId:  "serviceId1",
 			},
 		}
 		_, err := client.GetMongoClient().Insert(context.Background(), mongo.CollectionInstance, instance1)
 		assert.Equal(t, nil, err)
-		err = updateInstanceRefreshTime(context.Background(), instance1.InstanceInfo.ServiceId, instance1.InstanceInfo.InstanceId)
+		err = updateInstanceRefreshTime(context.Background(), instance1.Instance.ServiceId, instance1.Instance.InstanceId)
 		assert.Equal(t, nil, err)
 		filter := bson.M{
-			mongo.StringBuilder([]string{mongo.ColumnInstanceInfo, mongo.ColumnServiceID}):  instance1.InstanceInfo.ServiceId,
-			mongo.StringBuilder([]string{mongo.ColumnInstanceInfo, mongo.ColumnInstanceID}): instance1.InstanceInfo.InstanceId,
+			mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnServiceID}):  instance1.Instance.ServiceId,
+			mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnInstanceID}): instance1.Instance.InstanceId,
 		}
 		result, err := client.GetMongoClient().FindOne(context.Background(), mongo.CollectionInstance, filter)
 		assert.Nil(t, err)
@@ -69,8 +69,8 @@ func TestUpdateInstanceRefreshTime(t *testing.T) {
 		assert.Nil(t, err)
 		assert.NotEqual(t, instance1.RefreshTime, ins.RefreshTime)
 		filter = bson.M{
-			mongo.StringBuilder([]string{mongo.ColumnInstanceInfo, mongo.ColumnServiceID}):  instance1.InstanceInfo.ServiceId,
-			mongo.StringBuilder([]string{mongo.ColumnInstanceInfo, mongo.ColumnInstanceID}): instance1.InstanceInfo.InstanceId,
+			mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnServiceID}):  instance1.Instance.ServiceId,
+			mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnInstanceID}): instance1.Instance.InstanceId,
 		}
 		_, err = client.GetMongoClient().Delete(context.Background(), mongo.CollectionInstance, filter)
 		assert.Nil(t, err)
diff --git a/datasource/mongo/heartbeat/heartbeatchecker/heartbeatchecker.go b/datasource/mongo/heartbeat/checker/heartbeatchecker.go
similarity index 95%
rename from datasource/mongo/heartbeat/heartbeatchecker/heartbeatchecker.go
rename to datasource/mongo/heartbeat/checker/heartbeatchecker.go
index 03be2af..5183185 100644
--- a/datasource/mongo/heartbeat/heartbeatchecker/heartbeatchecker.go
+++ b/datasource/mongo/heartbeat/checker/heartbeatchecker.go
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package heartbeatchecker
+package checker
 
 import (
 	"context"
@@ -29,7 +29,7 @@ import (
 )
 
 func init() {
-	heartbeat.Install("heartbeatchecker", NewHeartBeatChecker)
+	heartbeat.Install("checker", NewHeartBeatChecker)
 }
 
 type HeartBeatChecker struct {
diff --git a/datasource/mongo/heartbeat/heartbeatchecker/heartbeatchecker_test.go b/datasource/mongo/heartbeat/checker/heartbeatchecker_test.go
similarity index 88%
rename from datasource/mongo/heartbeat/heartbeatchecker/heartbeatchecker_test.go
rename to datasource/mongo/heartbeat/checker/heartbeatchecker_test.go
index 25d0b89..71e69b8 100644
--- a/datasource/mongo/heartbeat/heartbeatchecker/heartbeatchecker_test.go
+++ b/datasource/mongo/heartbeat/checker/heartbeatchecker_test.go
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package heartbeatchecker
+package checker
 
 import (
 	"context"
@@ -44,7 +44,7 @@ func TestHeartbeat(t *testing.T) {
 	t.Run("heartbeat: if the instance does exist,the heartbeat should succeed", func(t *testing.T) {
 		instance1 := mongo.Instance{
 			RefreshTime: time.Now(),
-			InstanceInfo: &pb.MicroServiceInstance{
+			Instance: &pb.MicroServiceInstance{
 				InstanceId: "instanceId1",
 				ServiceId:  "serviceId1",
 			},
@@ -53,13 +53,13 @@ func TestHeartbeat(t *testing.T) {
 		assert.Equal(t, nil, err)
 		heartBeatChecker := &HeartBeatChecker{}
 		resp, err := heartBeatChecker.Heartbeat(context.Background(), &pb.HeartbeatRequest{
-			ServiceId:  instance1.InstanceInfo.ServiceId,
-			InstanceId: instance1.InstanceInfo.InstanceId,
+			ServiceId:  instance1.Instance.ServiceId,
+			InstanceId: instance1.Instance.InstanceId,
 		})
 		assert.Nil(t, err)
 		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
 		filter := bson.M{
-			mongo.StringBuilder([]string{mongo.ColumnInstanceInfo, mongo.ColumnInstanceID}): instance1.InstanceInfo.InstanceId,
+			mongo.StringBuilder([]string{mongo.ColumnInstance, mongo.ColumnInstanceID}): instance1.Instance.InstanceId,
 		}
 		_, err = client.GetMongoClient().Delete(context.Background(), mongo.CollectionInstance, filter)
 		assert.Nil(t, err)
diff --git a/datasource/mongo/heartbeat/manager_test.go b/datasource/mongo/heartbeat/manager_test.go
index 607c3a4..4ef38dd 100644
--- a/datasource/mongo/heartbeat/manager_test.go
+++ b/datasource/mongo/heartbeat/manager_test.go
@@ -23,7 +23,7 @@ import (
 	"github.com/stretchr/testify/assert"
 
 	"github.com/apache/servicecomb-service-center/datasource/mongo/heartbeat"
-	_ "github.com/apache/servicecomb-service-center/datasource/mongo/heartbeat/heartbeatchecker"
+	_ "github.com/apache/servicecomb-service-center/datasource/mongo/heartbeat/checker"
 )
 
 func TestInit(t *testing.T) {
@@ -33,7 +33,7 @@ func TestInit(t *testing.T) {
 		assert.Error(t, err)
 	})
 	t.Run("install and init heartbeat plugin, should pass", func(t *testing.T) {
-		pluginName := heartbeat.ImplName("heartbeatchecker")
+		pluginName := heartbeat.ImplName("checker")
 		err := heartbeat.Init(heartbeat.Options{
 			PluginImplName: pluginName,
 		})
diff --git a/datasource/mongo/mongo.go b/datasource/mongo/mongo.go
index 2248110..4ce4cdc 100644
--- a/datasource/mongo/mongo.go
+++ b/datasource/mongo/mongo.go
@@ -79,7 +79,7 @@ func (ds *DataSource) initialize() error {
 }
 
 func (ds *DataSource) initPlugins() error {
-	kind := config.GetString("registry.heartbeat.kind", "heartbeatchecker", config.WithStandby("heartbeat_plugin"))
+	kind := config.GetString("registry.mongo.heartbeat.kind", "cache")
 	err := heartbeat.Init(heartbeat.Options{PluginImplName: heartbeat.ImplName(kind)})
 	if err != nil {
 		log.Fatal("heartbeat init failed", err)
@@ -100,16 +100,16 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnServiceInfo, ColumnAlias}), Value: bsonx.Int32(1)}
+//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
 func (ds *DataSource) createIndexes() (err error) {
 	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnServiceInfo, ColumnServiceID}), Value: bsonx.Int32(1)}},
+		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
 		Options: options.Index().SetUnique(true),
 	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnServiceInfo, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnServiceInfo, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnServiceInfo, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnServiceInfo, ColumnVersion}), Value: bsonx.Int32(1)},
+		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
+			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
+			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
+			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
 			{Key: ColumnDomain, Value: bsonx.Int32(1)},
 			{Key: ColumnProject, Value: bsonx.Int32(1)},
 		},
@@ -119,7 +119,7 @@ func (ds *DataSource) createIndexes() (err error) {
 		return
 	}
 	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionInstance, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnInstanceInfo, ColumnInstanceID}), Value: bsonx.Int32(1)}},
+		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnInstance, ColumnInstanceID}), Value: bsonx.Int32(1)}},
 		Options: options.Index().SetUnique(true),
 	}, {
 		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnInstanceID, ColumnServiceID}), Value: bsonx.Int32(1)}},
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index 0a769ee..eb9cad3 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -94,7 +94,7 @@ func (ds *DataSource) RegisterService(ctx context.Context, request *discovery.Cr
 			}, nil
 		}
 	}
-	insertRes, err := client.GetMongoClient().Insert(ctx, CollectionService, &Service{Domain: domain, Project: project, ServiceInfo: service})
+	insertRes, err := client.GetMongoClient().Insert(ctx, CollectionService, &Service{Domain: domain, Project: project, Service: service})
 	if err != nil {
 		if client.IsDuplicateKey(err) {
 			serviceIDInner, err := GetServiceID(ctx, &discovery.MicroServiceKey{
@@ -163,7 +163,7 @@ func (ds *DataSource) GetApplications(ctx context.Context, request *discovery.Ge
 	filter := bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnServiceInfo, ColumnEnv}): request.Environment}
+		StringBuilder([]string{ColumnService, ColumnEnv}): request.Environment}
 
 	services, err := GetServices(ctx, filter)
 	if err != nil {
@@ -212,7 +212,7 @@ func (ds *DataSource) GetService(ctx context.Context, request *discovery.GetServ
 	}
 	return &discovery.GetServiceResponse{
 		Response: discovery.CreateResponse(discovery.ResponseSuccess, "Get service successfully."),
-		Service:  svc.ServiceInfo,
+		Service:  svc.Service,
 	}, nil
 }
 
@@ -304,7 +304,7 @@ func (ds *DataSource) DelServicePri(ctx context.Context, serviceID string, force
 	}
 	// 强制删除,则与该服务相关的信息删除,非强制删除: 如果作为该被依赖(作为provider,提供服务,且不是只存在自依赖)或者存在实例,则不能删除
 	if !force {
-		dr := NewProviderDependencyRelation(ctx, util.ParseDomainProject(ctx), microservice.ServiceInfo)
+		dr := NewProviderDependencyRelation(ctx, util.ParseDomainProject(ctx), microservice.Service)
 		services, err := dr.GetDependencyConsumerIds()
 		if err != nil {
 			log.Error(fmt.Sprintf("delete micro-service[%s] failed, get service dependency failed, operator: %s",
@@ -317,7 +317,7 @@ func (ds *DataSource) DelServicePri(ctx context.Context, serviceID string, force
 			return discovery.CreateResponse(discovery.ErrDependedOnConsumer, "Can not delete this service, other service rely it."), err
 		}
 		//todo wait for dep interface
-		instancesExist, err := client.GetMongoClient().DocExist(ctx, CollectionInstance, bson.M{StringBuilder([]string{ColumnInstanceInfo, ColumnServiceID}): serviceID})
+		instancesExist, err := client.GetMongoClient().DocExist(ctx, CollectionInstance, bson.M{StringBuilder([]string{ColumnInstance, ColumnServiceID}): serviceID})
 		if err != nil {
 			log.Error(fmt.Sprintf("delete micro-service[%s] failed, get instances number failed, operator: %s",
 				serviceID, remoteIP), err)
@@ -333,8 +333,8 @@ func (ds *DataSource) DelServicePri(ctx context.Context, serviceID string, force
 
 	schemaOps := client.MongoOperation{Table: CollectionSchema, Models: []mongo.WriteModel{mongo.NewDeleteManyModel().SetFilter(bson.M{ColumnServiceID: serviceID})}}
 	rulesOps := client.MongoOperation{Table: CollectionRule, Models: []mongo.WriteModel{mongo.NewDeleteManyModel().SetFilter(bson.M{ColumnServiceID: serviceID})}}
-	instanceOps := client.MongoOperation{Table: CollectionInstance, Models: []mongo.WriteModel{mongo.NewDeleteManyModel().SetFilter(bson.M{StringBuilder([]string{ColumnInstanceInfo, ColumnServiceID}): serviceID})}}
-	serviceOps := client.MongoOperation{Table: CollectionService, Models: []mongo.WriteModel{mongo.NewDeleteOneModel().SetFilter(bson.M{StringBuilder([]string{ColumnServiceInfo, ColumnServiceID}): serviceID})}}
+	instanceOps := client.MongoOperation{Table: CollectionInstance, Models: []mongo.WriteModel{mongo.NewDeleteManyModel().SetFilter(bson.M{StringBuilder([]string{ColumnInstance, ColumnServiceID}): serviceID})}}
+	serviceOps := client.MongoOperation{Table: CollectionService, Models: []mongo.WriteModel{mongo.NewDeleteOneModel().SetFilter(bson.M{StringBuilder([]string{ColumnService, ColumnServiceID}): serviceID})}}
 
 	err = client.GetMongoClient().MultiTableBatchUpdate(ctx, []client.MongoOperation{schemaOps, rulesOps, instanceOps, serviceOps})
 	if err != nil {
@@ -345,11 +345,11 @@ func (ds *DataSource) DelServicePri(ctx context.Context, serviceID string, force
 	domainProject := util.ToDomainProject(microservice.Domain, microservice.Project)
 	serviceKey := &discovery.MicroServiceKey{
 		Tenant:      domainProject,
-		Environment: microservice.ServiceInfo.Environment,
-		AppId:       microservice.ServiceInfo.AppId,
-		ServiceName: microservice.ServiceInfo.ServiceName,
-		Version:     microservice.ServiceInfo.Version,
-		Alias:       microservice.ServiceInfo.Alias,
+		Environment: microservice.Service.Environment,
+		AppId:       microservice.Service.AppId,
+		ServiceName: microservice.Service.ServiceName,
+		Version:     microservice.Service.Version,
+		Alias:       microservice.Service.Alias,
 	}
 
 	err = DeleteDependencyForDeleteService(domainProject, serviceID, serviceKey)
@@ -365,8 +365,8 @@ func (ds *DataSource) UpdateService(ctx context.Context, request *discovery.Upda
 	*discovery.UpdateServicePropsResponse, error) {
 	updateData := bson.M{
 		"$set": bson.M{
-			StringBuilder([]string{ColumnServiceInfo, ColumnModTime}):  strconv.FormatInt(time.Now().Unix(), 10),
-			StringBuilder([]string{ColumnServiceInfo, ColumnProperty}): request.Properties}}
+			StringBuilder([]string{ColumnService, ColumnModTime}):  strconv.FormatInt(time.Now().Unix(), 10),
+			StringBuilder([]string{ColumnService, ColumnProperty}): request.Properties}}
 	err := UpdateService(ctx, GeneratorServiceFilter(ctx, request.ServiceId), updateData)
 	if err != nil {
 		log.Error(fmt.Sprintf("update service %s properties failed, update mongo failed", request.ServiceId), err)
@@ -410,7 +410,7 @@ func (ds *DataSource) GetServiceDetail(ctx context.Context, request *discovery.G
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 		}, err
 	}
-	svc := mgSvc.ServiceInfo
+	svc := mgSvc.Service
 	key := &discovery.MicroServiceKey{
 		Environment: svc.Environment,
 		AppId:       svc.AppId,
@@ -481,14 +481,14 @@ func (ds *DataSource) GetServicesInfo(ctx context.Context, request *discovery.Ge
 	allServiceDetails := make([]*discovery.ServiceDetail, 0, len(services))
 	domainProject := util.ParseDomainProject(ctx)
 	for _, mgSvc := range services {
-		if !request.WithShared && apt.IsGlobal(discovery.MicroServiceToKey(domainProject, mgSvc.ServiceInfo)) {
+		if !request.WithShared && apt.IsGlobal(discovery.MicroServiceToKey(domainProject, mgSvc.Service)) {
 			continue
 		}
 		if len(request.AppId) > 0 {
-			if request.AppId != mgSvc.ServiceInfo.AppId {
+			if request.AppId != mgSvc.Service.AppId {
 				continue
 			}
-			if len(request.ServiceName) > 0 && request.ServiceName != mgSvc.ServiceInfo.ServiceName {
+			if len(request.ServiceName) > 0 && request.ServiceName != mgSvc.Service.ServiceName {
 				continue
 			}
 		}
@@ -499,7 +499,7 @@ func (ds *DataSource) GetServicesInfo(ctx context.Context, request *discovery.Ge
 				Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 			}, err
 		}
-		serviceDetail.MicroService = mgSvc.ServiceInfo
+		serviceDetail.MicroService = mgSvc.Service
 		allServiceDetails = append(allServiceDetails, serviceDetail)
 	}
 
@@ -654,7 +654,7 @@ func (ds *DataSource) GetSchema(ctx context.Context, request *discovery.GetSchem
 	}
 	return &discovery.GetSchemaResponse{
 		Response:      discovery.CreateResponse(discovery.ResponseSuccess, "Get schema info successfully."),
-		Schema:        schema.SchemaInfo,
+		Schema:        schema.Schema,
 		SchemaSummary: schema.SchemaSummary,
 	}, nil
 }
@@ -673,7 +673,7 @@ func (ds *DataSource) GetAllSchemas(ctx context.Context, request *discovery.GetA
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 		}, err
 	}
-	schemasList := svc.ServiceInfo.Schemas
+	schemasList := svc.Service.Schemas
 	if len(schemasList) == 0 {
 		return &discovery.GetAllSchemaResponse{
 			Response: discovery.CreateResponse(discovery.ResponseSuccess, "Do not have this schema info."),
@@ -696,7 +696,7 @@ func (ds *DataSource) GetAllSchemas(ctx context.Context, request *discovery.GetA
 		}
 		tempSchema.Summary = schema.SchemaSummary
 		if request.WithSchema {
-			tempSchema.Schema = schema.SchemaInfo
+			tempSchema.Schema = schema.Schema
 		}
 		schemas = append(schemas, tempSchema)
 	}
@@ -800,7 +800,7 @@ func (ds *DataSource) ModifySchemas(ctx context.Context, request *discovery.Modi
 		}
 		return &discovery.ModifySchemasResponse{Response: discovery.CreateResponse(discovery.ErrInternal, err.Error())}, err
 	}
-	respErr := ds.modifySchemas(ctx, svc.ServiceInfo, request.Schemas)
+	respErr := ds.modifySchemas(ctx, svc.Service, request.Schemas)
 	if respErr != nil {
 		resp := &discovery.ModifySchemasResponse{
 			Response: discovery.CreateResponseWithSCErr(respErr),
@@ -842,7 +842,7 @@ func (ds *DataSource) modifySchemas(ctx context.Context, service *discovery.Micr
 				log.Error(fmt.Sprintf("modify service[%s] schemas failed, operator: %s", serviceID, remoteIP), errQuota)
 				return errQuota
 			}
-			serviceOps = append(serviceOps, mongo.NewUpdateOneModel().SetUpdate(bson.M{"$set": bson.M{StringBuilder([]string{ColumnServiceInfo, ColumnSchemas}): nonExistSchemaIds}}).SetFilter(GeneratorServiceFilter(ctx, serviceID)))
+			serviceOps = append(serviceOps, mongo.NewUpdateOneModel().SetUpdate(bson.M{"$set": bson.M{StringBuilder([]string{ColumnService, ColumnSchemas}): nonExistSchemaIds}}).SetFilter(GeneratorServiceFilter(ctx, serviceID)))
 		} else {
 			if len(nonExistSchemaIds) != 0 {
 				errInfo := fmt.Errorf("non-existent schemaIDs %v", nonExistSchemaIds)
@@ -855,7 +855,7 @@ func (ds *DataSource) modifySchemas(ctx context.Context, service *discovery.Micr
 					return discovery.NewError(discovery.ErrInternal, err.Error())
 				}
 				if !exist {
-					schemasOps = append(schemasOps, mongo.NewUpdateOneModel().SetFilter(GeneratorSchemaFilter(ctx, serviceID, needUpdateSchema.SchemaId)).SetUpdate(bson.M{"$set": bson.M{ColumnSchemaInfo: needUpdateSchema.Schema, ColumnSchemaSummary: needUpdateSchema.Summary}}))
+					schemasOps = append(schemasOps, mongo.NewUpdateOneModel().SetFilter(GeneratorSchemaFilter(ctx, serviceID, needUpdateSchema.SchemaId)).SetUpdate(bson.M{"$set": bson.M{ColumnSchema: needUpdateSchema.Schema, ColumnSchemaSummary: needUpdateSchema.Summary}}))
 				} else {
 					log.Warn(fmt.Sprintf("schema[%s/%s] and it's summary already exist, skip to update, operator: %s",
 						serviceID, needUpdateSchema.SchemaId, remoteIP))
@@ -870,7 +870,7 @@ func (ds *DataSource) modifySchemas(ctx context.Context, service *discovery.Micr
 				Project:       project,
 				ServiceID:     serviceID,
 				SchemaID:      schema.SchemaId,
-				SchemaInfo:    schema.Schema,
+				Schema:        schema.Schema,
 				SchemaSummary: schema.Summary,
 			}))
 		}
@@ -893,7 +893,7 @@ func (ds *DataSource) modifySchemas(ctx context.Context, service *discovery.Micr
 				Project:       project,
 				ServiceID:     serviceID,
 				SchemaID:      schema.SchemaId,
-				SchemaInfo:    schema.Schema,
+				Schema:        schema.Schema,
 				SchemaSummary: schema.Summary,
 			}))
 			schemaIDs = append(schemaIDs, schema.SchemaId)
@@ -901,7 +901,7 @@ func (ds *DataSource) modifySchemas(ctx context.Context, service *discovery.Micr
 
 		for _, schema := range needUpdateSchemas {
 			log.Info(fmt.Sprintf("update schema[%s/%s], operator: %s", serviceID, schema.SchemaId, remoteIP))
-			schemasOps = append(schemasOps, mongo.NewUpdateOneModel().SetFilter(GeneratorSchemaFilter(ctx, serviceID, schema.SchemaId)).SetUpdate(bson.M{"$set": bson.M{ColumnSchemaInfo: schema.Schema, ColumnSchemaSummary: schema.Summary}}))
+			schemasOps = append(schemasOps, mongo.NewUpdateOneModel().SetFilter(GeneratorSchemaFilter(ctx, serviceID, schema.SchemaId)).SetUpdate(bson.M{"$set": bson.M{ColumnSchema: schema.Schema, ColumnSchemaSummary: schema.Summary}}))
 			schemaIDs = append(schemaIDs, schema.SchemaId)
 		}
 
@@ -910,7 +910,7 @@ func (ds *DataSource) modifySchemas(ctx context.Context, service *discovery.Micr
 			schemasOps = append(schemasOps, mongo.NewDeleteOneModel().SetFilter(GeneratorSchemaFilter(ctx, serviceID, schema.SchemaId)))
 		}
 
-		serviceOps = append(serviceOps, mongo.NewUpdateOneModel().SetUpdate(bson.M{"$set": bson.M{StringBuilder([]string{ColumnServiceInfo, ColumnSchemas}): schemaIDs}}).SetFilter(GeneratorServiceFilter(ctx, serviceID)))
+		serviceOps = append(serviceOps, mongo.NewUpdateOneModel().SetUpdate(bson.M{"$set": bson.M{StringBuilder([]string{ColumnService, ColumnSchemas}): schemaIDs}}).SetFilter(GeneratorServiceFilter(ctx, serviceID)))
 	}
 	if len(schemasOps) > 0 {
 		_, err = client.GetMongoClient().BatchUpdate(ctx, CollectionSchema, schemasOps)
@@ -941,7 +941,7 @@ func (ds *DataSource) modifySchema(ctx context.Context, serviceID string, schema
 		}
 		return discovery.NewError(discovery.ErrInternal, err.Error())
 	}
-	microservice := svc.ServiceInfo
+	microservice := svc.Service
 	var isExist bool
 	for _, sid := range microservice.Schemas {
 		if sid == schema.SchemaId {
@@ -982,13 +982,13 @@ func (ds *DataSource) modifySchema(ctx context.Context, serviceID string, schema
 		}
 	}
 	if len(newSchemas) != 0 {
-		updateData := bson.M{StringBuilder([]string{ColumnServiceInfo, ColumnSchemas}): newSchemas}
+		updateData := bson.M{StringBuilder([]string{ColumnService, ColumnSchemas}): newSchemas}
 		err = UpdateService(ctx, GeneratorServiceFilter(ctx, serviceID), bson.M{"$set": updateData})
 		if err != nil {
 			return discovery.NewError(discovery.ErrInternal, err.Error())
 		}
 	}
-	newSchema := bson.M{"$set": bson.M{ColumnSchemaInfo: schema.Schema, ColumnSchemaSummary: schema.Summary}}
+	newSchema := bson.M{"$set": bson.M{ColumnSchema: schema.Schema, ColumnSchemaSummary: schema.Summary}}
 	err = UpdateSchema(ctx, GeneratorSchemaFilter(ctx, serviceID, schema.SchemaId), newSchema, options.FindOneAndUpdate().SetUpsert(true))
 	if err != nil {
 		return discovery.NewError(discovery.ErrInternal, err.Error())
@@ -1055,7 +1055,7 @@ func (ds *DataSource) AddRule(ctx context.Context, request *discovery.AddService
 			Domain:    util.ParseDomain(ctx),
 			Project:   util.ParseProject(ctx),
 			ServiceID: request.ServiceId,
-			RuleInfo: &discovery.ServiceRule{
+			Rule: &discovery.ServiceRule{
 				RuleId:       util.GenerateUUID(),
 				RuleType:     rule.RuleType,
 				Attribute:    rule.Attribute,
@@ -1065,7 +1065,7 @@ func (ds *DataSource) AddRule(ctx context.Context, request *discovery.AddService
 				ModTimestamp: timestamp,
 			},
 		}
-		ruleIDs = append(ruleIDs, ruleAdd.RuleInfo.RuleId)
+		ruleIDs = append(ruleIDs, ruleAdd.Rule.RuleId)
 		_, err = client.GetMongoClient().Insert(ctx, CollectionRule, ruleAdd)
 		if err != nil {
 			return &discovery.AddServiceRulesResponse{
@@ -1180,11 +1180,11 @@ func (ds *DataSource) UpdateRule(ctx context.Context, request *discovery.UpdateS
 	}
 
 	newRule := bson.M{
-		StringBuilder([]string{ColumnRuleInfo, ColumnRuleType}):    request.Rule.RuleType,
-		StringBuilder([]string{ColumnRuleInfo, ColumnPattern}):     request.Rule.Pattern,
-		StringBuilder([]string{ColumnRuleInfo, ColumnAttribute}):   request.Rule.Attribute,
-		StringBuilder([]string{ColumnRuleInfo, ColumnDescription}): request.Rule.Description,
-		StringBuilder([]string{ColumnRuleInfo, ColumnModTime}):     strconv.FormatInt(time.Now().Unix(), 10)}
+		StringBuilder([]string{ColumnRule, ColumnRuleType}):    request.Rule.RuleType,
+		StringBuilder([]string{ColumnRule, ColumnPattern}):     request.Rule.Pattern,
+		StringBuilder([]string{ColumnRule, ColumnAttribute}):   request.Rule.Attribute,
+		StringBuilder([]string{ColumnRule, ColumnDescription}): request.Rule.Description,
+		StringBuilder([]string{ColumnRule, ColumnModTime}):     strconv.FormatInt(time.Now().Unix(), 10)}
 
 	err = UpdateRule(ctx, GeneratorRuleFilter(ctx, request.ServiceId, request.RuleId), bson.M{"$set": newRule})
 	if err != nil {
@@ -1240,7 +1240,7 @@ func GetServices(ctx context.Context, filter bson.M) ([]*discovery.MicroService,
 		if err != nil {
 			return nil, err
 		}
-		services = append(services, tmp.ServiceInfo)
+		services = append(services, tmp.Service)
 	}
 	return services, nil
 }
@@ -1274,14 +1274,14 @@ func GetServicesVersions(ctx context.Context, filter interface{}) ([]string, err
 		if err != nil {
 			return nil, err
 		}
-		versions = append(versions, tmp.ServiceInfo.Version)
+		versions = append(versions, tmp.Service.Version)
 	}
 	return versions, nil
 }
 
 func getServiceDetailUtil(ctx context.Context, mgs *Service, countOnly bool, options []string) (*discovery.ServiceDetail, error) {
 	serviceDetail := new(discovery.ServiceDetail)
-	serviceID := mgs.ServiceInfo.ServiceId
+	serviceID := mgs.Service.ServiceId
 	domainProject := util.ParseDomainProject(ctx)
 	if countOnly {
 		serviceDetail.Statics = new(discovery.Statistics)
@@ -1292,9 +1292,9 @@ func getServiceDetailUtil(ctx context.Context, mgs *Service, countOnly bool, opt
 		case "tags":
 			serviceDetail.Tags = mgs.Tags
 		case "rules":
-			rules, err := GetRules(ctx, mgs.ServiceInfo.ServiceId)
+			rules, err := GetRules(ctx, mgs.Service.ServiceId)
 			if err != nil {
-				log.Error(fmt.Sprintf("get service %s's all rules failed", mgs.ServiceInfo.ServiceId), err)
+				log.Error(fmt.Sprintf("get service %s's all rules failed", mgs.Service.ServiceId), err)
 				return nil, err
 			}
 			for _, rule := range rules {
@@ -1320,14 +1320,14 @@ func getServiceDetailUtil(ctx context.Context, mgs *Service, countOnly bool, opt
 			}
 			serviceDetail.Instances = instances
 		case "schemas":
-			schemas, err := GetSchemas(ctx, GeneratorServiceFilter(ctx, mgs.ServiceInfo.ServiceId))
+			schemas, err := GetSchemas(ctx, GeneratorServiceFilter(ctx, mgs.Service.ServiceId))
 			if err != nil {
-				log.Error(fmt.Sprintf("get service %s's all schemas failed", mgs.ServiceInfo.ServiceId), err)
+				log.Error(fmt.Sprintf("get service %s's all schemas failed", mgs.Service.ServiceId), err)
 				return nil, err
 			}
 			serviceDetail.SchemaInfos = schemas
 		case "dependencies":
-			service := mgs.ServiceInfo
+			service := mgs.Service
 			dr := NewDependencyRelation(ctx, domainProject, service, service)
 			consumers, err := dr.GetDependencyConsumers(WithoutSelfDependency(), WithSameDomainProject())
 			if err != nil {
@@ -1371,7 +1371,7 @@ func GetRules(ctx context.Context, serviceID string) ([]*discovery.ServiceRule,
 		if err != nil {
 			return nil, err
 		}
-		rules = append(rules, tmpRule.RuleInfo)
+		rules = append(rules, tmpRule.Rule)
 	}
 	return rules, nil
 }
@@ -1410,7 +1410,7 @@ func GeneratorServiceFilter(ctx context.Context, serviceID string) bson.M {
 	return bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnServiceInfo, ColumnServiceID}): serviceID}
+		StringBuilder([]string{ColumnService, ColumnServiceID}): serviceID}
 }
 
 func GeneratorServiceNameFilter(ctx context.Context, service *discovery.MicroServiceKey) bson.M {
@@ -1420,10 +1420,10 @@ func GeneratorServiceNameFilter(ctx context.Context, service *discovery.MicroSer
 	return bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnServiceInfo, ColumnEnv}):         service.Environment,
-		StringBuilder([]string{ColumnServiceInfo, ColumnAppID}):       service.AppId,
-		StringBuilder([]string{ColumnServiceInfo, ColumnServiceName}): service.ServiceName,
-		StringBuilder([]string{ColumnServiceInfo, ColumnVersion}):     service.Version}
+		StringBuilder([]string{ColumnService, ColumnEnv}):         service.Environment,
+		StringBuilder([]string{ColumnService, ColumnAppID}):       service.AppId,
+		StringBuilder([]string{ColumnService, ColumnServiceName}): service.ServiceName,
+		StringBuilder([]string{ColumnService, ColumnVersion}):     service.Version}
 }
 
 func GeneratorServiceAliasFilter(ctx context.Context, service *discovery.MicroServiceKey) bson.M {
@@ -1433,17 +1433,17 @@ func GeneratorServiceAliasFilter(ctx context.Context, service *discovery.MicroSe
 	return bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnServiceInfo, ColumnEnv}):     service.Environment,
-		StringBuilder([]string{ColumnServiceInfo, ColumnAppID}):   service.AppId,
-		StringBuilder([]string{ColumnServiceInfo, ColumnAlias}):   service.Alias,
-		StringBuilder([]string{ColumnServiceInfo, ColumnVersion}): service.Version}
+		StringBuilder([]string{ColumnService, ColumnEnv}):     service.Environment,
+		StringBuilder([]string{ColumnService, ColumnAppID}):   service.AppId,
+		StringBuilder([]string{ColumnService, ColumnAlias}):   service.Alias,
+		StringBuilder([]string{ColumnService, ColumnVersion}): service.Version}
 }
 
 func GeneratorRuleAttFilter(ctx context.Context, serviceID, attribute, pattern string) bson.M {
 	return bson.M{
 		ColumnServiceID: serviceID,
-		StringBuilder([]string{ColumnRuleInfo, ColumnAttribute}): attribute,
-		StringBuilder([]string{ColumnRuleInfo, ColumnPattern}):   pattern}
+		StringBuilder([]string{ColumnRule, ColumnAttribute}): attribute,
+		StringBuilder([]string{ColumnRule, ColumnPattern}):   pattern}
 }
 
 func GeneratorSchemaFilter(ctx context.Context, serviceID, schemaID string) bson.M {
@@ -1461,7 +1461,7 @@ func GeneratorRuleFilter(ctx context.Context, serviceID, ruleID string) bson.M {
 		ColumnDomain:    domain,
 		ColumnProject:   project,
 		ColumnServiceID: serviceID,
-		StringBuilder([]string{ColumnRuleInfo, ColumnRuleID}): ruleID}
+		StringBuilder([]string{ColumnRule, ColumnRuleID}): ruleID}
 }
 
 func GetSchemas(ctx context.Context, filter bson.M) ([]*discovery.Schema, error) {
@@ -1479,7 +1479,7 @@ func GetSchemas(ctx context.Context, filter bson.M) ([]*discovery.Schema, error)
 		schemas = append(schemas, &discovery.Schema{
 			SchemaId: tmp.SchemaID,
 			Summary:  tmp.SchemaSummary,
-			Schema:   tmp.SchemaInfo,
+			Schema:   tmp.Schema,
 		})
 	}
 	return schemas, nil
@@ -1610,13 +1610,13 @@ func (ds *DataSource) GetInstance(ctx context.Context, request *discovery.GetOne
 	}
 	findFlag := func() string {
 		return fmt.Sprintf("consumer[%s][%s/%s/%s/%s] find provider[%s][%s/%s/%s/%s] instance[%s]",
-			request.ConsumerServiceId, service.ServiceInfo.Environment, service.ServiceInfo.AppId, service.ServiceInfo.ServiceName, service.ServiceInfo.Version,
-			provider.ServiceInfo.ServiceId, provider.ServiceInfo.Environment, provider.ServiceInfo.AppId, provider.ServiceInfo.ServiceName, provider.ServiceInfo.Version,
+			request.ConsumerServiceId, service.Service.Environment, service.Service.AppId, service.Service.ServiceName, service.Service.Version,
+			provider.Service.ServiceId, provider.Service.Environment, provider.Service.AppId, provider.Service.ServiceName, provider.Service.Version,
 			request.ProviderInstanceId)
 	}
 
 	domainProject := util.ParseDomainProject(ctx)
-	services, err := findServices(ctx, discovery.MicroServiceToKey(domainProject, provider.ServiceInfo))
+	services, err := findServices(ctx, discovery.MicroServiceToKey(domainProject, provider.Service))
 	if err != nil {
 		log.Error(fmt.Sprintf("get instance failed %s", findFlag()), err)
 		return &discovery.GetOneInstanceResponse{
@@ -1714,8 +1714,8 @@ func (ds *DataSource) GetInstances(ctx context.Context, request *discovery.GetIn
 
 	findFlag := func() string {
 		return fmt.Sprintf("consumer[%s][%s/%s/%s/%s] find provider[%s][%s/%s/%s/%s] instances",
-			request.ConsumerServiceId, service.ServiceInfo.Environment, service.ServiceInfo.AppId, service.ServiceInfo.ServiceName, service.ServiceInfo.Version,
-			provider.ServiceInfo.ServiceId, provider.ServiceInfo.Environment, provider.ServiceInfo.AppId, provider.ServiceInfo.ServiceName, provider.ServiceInfo.Version)
+			request.ConsumerServiceId, service.Service.Environment, service.Service.AppId, service.Service.ServiceName, service.Service.Version,
+			provider.Service.ServiceId, provider.Service.Environment, provider.Service.AppId, provider.Service.ServiceName, provider.Service.Version)
 	}
 
 	rev, _ := ctx.Value(util.CtxRequestRevision).(string)
@@ -1752,7 +1752,7 @@ func (ds *DataSource) GetProviderInstances(ctx context.Context, request *discove
 	filter := bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnInstanceInfo, ColumnServiceID}): request.ProviderServiceId}
+		StringBuilder([]string{ColumnInstance, ColumnServiceID}): request.ProviderServiceId}
 
 	findRes, err := client.GetMongoClient().Find(ctx, CollectionInstance, filter)
 	if err != nil {
@@ -1763,7 +1763,7 @@ func (ds *DataSource) GetProviderInstances(ctx context.Context, request *discove
 		var mongoInstance Instance
 		err := findRes.Decode(&mongoInstance)
 		if err == nil {
-			instances = append(instances, mongoInstance.InstanceInfo)
+			instances = append(instances, mongoInstance.Instance)
 		}
 	}
 
@@ -1793,7 +1793,7 @@ func (ds *DataSource) GetAllInstances(ctx context.Context, request *discovery.Ge
 				Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 			}, err
 		}
-		resp.Instances = append(resp.Instances, instance.InstanceInfo)
+		resp.Instances = append(resp.Instances, instance.Instance)
 	}
 
 	return resp, nil
@@ -1811,7 +1811,7 @@ func (ds *DataSource) BatchGetProviderInstances(ctx context.Context, request *di
 		filter := bson.M{
 			ColumnDomain:  domain,
 			ColumnProject: project,
-			StringBuilder([]string{ColumnInstanceInfo, ColumnServiceID}): providerServiceID}
+			StringBuilder([]string{ColumnInstance, ColumnServiceID}): providerServiceID}
 		findRes, err := client.GetMongoClient().Find(ctx, CollectionInstance, filter)
 		if err != nil {
 			return instances, "", nil
@@ -1821,7 +1821,7 @@ func (ds *DataSource) BatchGetProviderInstances(ctx context.Context, request *di
 			var mongoInstance Instance
 			err := findRes.Decode(&mongoInstance)
 			if err == nil {
-				instances = append(instances, mongoInstance.InstanceInfo)
+				instances = append(instances, mongoInstance.Instance)
 			}
 		}
 	}
@@ -1874,9 +1874,9 @@ func (ds *DataSource) UpdateInstanceStatus(ctx context.Context, request *discove
 	}
 
 	copyInstanceRef := *instance
-	copyInstanceRef.InstanceInfo.Status = request.Status
+	copyInstanceRef.Instance.Status = request.Status
 
-	if err := UpdateInstanceS(ctx, copyInstanceRef.InstanceInfo); err != nil {
+	if err := UpdateInstanceS(ctx, copyInstanceRef.Instance); err != nil {
 		log.Error(fmt.Sprintf("update instance %s status failed", updateStatusFlag), err)
 		resp := &discovery.UpdateInstanceStatusResponse{
 			Response: discovery.CreateResponseWithSCErr(err),
@@ -1911,10 +1911,10 @@ func (ds *DataSource) UpdateInstanceProperties(ctx context.Context, request *dis
 	}
 
 	copyInstanceRef := *instance
-	copyInstanceRef.InstanceInfo.Properties = request.Properties
+	copyInstanceRef.Instance.Properties = request.Properties
 
 	// todo finish update instance
-	if err := UpdateInstanceP(ctx, copyInstanceRef.InstanceInfo); err != nil {
+	if err := UpdateInstanceP(ctx, copyInstanceRef.Instance); err != nil {
 		log.Error(fmt.Sprintf("update instance %s properties failed", instanceFlag), err)
 		resp := &discovery.UpdateInstancePropsResponse{
 			Response: discovery.CreateResponseWithSCErr(err),
@@ -1943,8 +1943,8 @@ func (ds *DataSource) UnregisterInstance(ctx context.Context, request *discovery
 	filter := bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnInstanceInfo, ColumnServiceID}):  serviceID,
-		StringBuilder([]string{ColumnInstanceInfo, ColumnInstanceID}): instanceID}
+		StringBuilder([]string{ColumnInstance, ColumnServiceID}):  serviceID,
+		StringBuilder([]string{ColumnInstance, ColumnInstanceID}): instanceID}
 	result, err := client.GetMongoClient().Delete(ctx, CollectionInstance, filter)
 	if err != nil || result.DeletedCount == 0 {
 		log.Error(fmt.Sprintf("unregister instance failed, instance %s, operator %s revoke instance failed", instanceFlag, remoteIP), err)
@@ -2063,10 +2063,10 @@ func registryInstance(ctx context.Context, request *discovery.RegisterInstanceRe
 	instance := request.Instance
 	instanceID := instance.InstanceId
 	data := &Instance{
-		Domain:       domain,
-		Project:      project,
-		RefreshTime:  time.Now(),
-		InstanceInfo: instance,
+		Domain:      domain,
+		Project:     project,
+		RefreshTime: time.Now(),
+		Instance:    instance,
 	}
 
 	instanceFlag := fmt.Sprintf("endpoints %v, host '%s', serviceID %s",
@@ -2139,7 +2139,7 @@ func (ds *DataSource) findSharedServiceInstance(ctx context.Context, request *di
 func (ds *DataSource) findInstance(ctx context.Context, request *discovery.FindInstancesRequest, provider *discovery.MicroServiceKey, rev string) (*discovery.FindInstancesResponse, error) {
 	var err error
 	domainProject := util.ParseDomainProject(ctx)
-	service := &Service{ServiceInfo: &discovery.MicroService{Environment: request.Environment}}
+	service := &Service{Service: &discovery.MicroService{Environment: request.Environment}}
 	if len(request.ConsumerServiceId) > 0 {
 		filter := GeneratorServiceFilter(ctx, request.ConsumerServiceId)
 		service, err = GetService(ctx, filter)
@@ -2158,7 +2158,7 @@ func (ds *DataSource) findInstance(ctx context.Context, request *discovery.FindI
 				Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 			}, err
 		}
-		provider.Environment = service.ServiceInfo.Environment
+		provider.Environment = service.Service.Environment
 	}
 
 	// provider is not a shared micro-service,
@@ -2168,7 +2168,7 @@ func (ds *DataSource) findInstance(ctx context.Context, request *discovery.FindI
 
 	findFlag := func() string {
 		return fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find provider[%s/%s/%s/%s]",
-			request.ConsumerServiceId, service.ServiceInfo.Environment, service.ServiceInfo.AppId, service.ServiceInfo.ServiceName, service.ServiceInfo.Version,
+			request.ConsumerServiceId, service.Service.Environment, service.Service.AppId, service.Service.ServiceName, service.Service.Version,
 			provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
 	}
 	basicFilterServices, err := servicesBasicFilter(ctx, provider)
@@ -2208,7 +2208,7 @@ func (ds *DataSource) findInstance(ctx context.Context, request *discovery.FindI
 			return nil, err
 		}
 		if provider != nil {
-			err = AddServiceVersionRule(ctx, domainProject, service.ServiceInfo, provider)
+			err = AddServiceVersionRule(ctx, domainProject, service.Service, provider)
 		} else {
 			mes := fmt.Errorf("%s failed, provider does not exist", findFlag())
 			log.Error("add service version rule failed", mes)
@@ -2245,7 +2245,7 @@ func (ds *DataSource) reshapeProviderKey(ctx context.Context, provider *discover
 	}
 
 	versionRule := provider.Version
-	provider = discovery.MicroServiceToKey(provider.Tenant, providerService.ServiceInfo)
+	provider = discovery.MicroServiceToKey(provider.Tenant, providerService.Service)
 	provider.Version = versionRule
 	return provider, nil
 }
@@ -2309,8 +2309,8 @@ func GetInstance(ctx context.Context, serviceID string, instanceID string) (*Ins
 	filter := bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnInstanceInfo, ColumnServiceID}):  serviceID,
-		StringBuilder([]string{ColumnInstanceInfo, ColumnInstanceID}): instanceID}
+		StringBuilder([]string{ColumnInstance, ColumnServiceID}):  serviceID,
+		StringBuilder([]string{ColumnInstance, ColumnInstanceID}): instanceID}
 	findRes, err := client.GetMongoClient().FindOne(ctx, CollectionInstance, filter)
 	if err != nil {
 		return nil, err
@@ -2333,8 +2333,8 @@ func UpdateInstanceS(ctx context.Context, instance *discovery.MicroServiceInstan
 	filter := bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnInstanceInfo, ColumnServiceID}):  instance.ServiceId,
-		StringBuilder([]string{ColumnInstanceInfo, ColumnInstanceID}): instance.InstanceId}
+		StringBuilder([]string{ColumnInstance, ColumnServiceID}):  instance.ServiceId,
+		StringBuilder([]string{ColumnInstance, ColumnInstanceID}): instance.InstanceId}
 	_, err := client.GetMongoClient().Update(ctx, CollectionInstance, filter, bson.M{"$set": bson.M{"instance.motTimestamp": strconv.FormatInt(time.Now().Unix(), 10), "instance.status": instance.Status}})
 	if err != nil {
 		return discovery.NewError(discovery.ErrUnavailableBackend, err.Error())
@@ -2348,8 +2348,8 @@ func UpdateInstanceP(ctx context.Context, instance *discovery.MicroServiceInstan
 	filter := bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnInstanceInfo, ColumnServiceID}):  instance.ServiceId,
-		StringBuilder([]string{ColumnInstanceInfo, ColumnInstanceID}): instance.InstanceId}
+		StringBuilder([]string{ColumnInstance, ColumnServiceID}):  instance.ServiceId,
+		StringBuilder([]string{ColumnInstance, ColumnInstanceID}): instance.InstanceId}
 	_, err := client.GetMongoClient().Update(ctx, CollectionInstance, filter, bson.M{"$set": bson.M{"instance.motTimestamp": strconv.FormatInt(time.Now().Unix(), 10), "instance.properties": instance.Properties}})
 	if err != nil {
 		return discovery.NewError(discovery.ErrUnavailableBackend, err.Error())
@@ -2519,7 +2519,7 @@ func preProcessRegisterInstance(ctx context.Context, instance *discovery.MicroSe
 	if err != nil {
 		return discovery.NewError(discovery.ErrServiceNotExists, "invalid 'serviceID' in request body.")
 	}
-	instance.Version = microservice.ServiceInfo.Version
+	instance.Version = microservice.Service.Version
 	return nil
 }
 
@@ -2532,10 +2532,10 @@ func servicesBasicFilter(ctx context.Context, key *discovery.MicroServiceKey) ([
 	filter := bson.M{
 		ColumnDomain:  tenant[0],
 		ColumnProject: tenant[1],
-		StringBuilder([]string{ColumnServiceInfo, ColumnEnv}):         key.Environment,
-		StringBuilder([]string{ColumnServiceInfo, ColumnAppID}):       key.AppId,
-		StringBuilder([]string{ColumnServiceInfo, ColumnServiceName}): key.ServiceName,
-		StringBuilder([]string{ColumnServiceInfo, ColumnAlias}):       key.Alias,
+		StringBuilder([]string{ColumnService, ColumnEnv}):         key.Environment,
+		StringBuilder([]string{ColumnService, ColumnAppID}):       key.AppId,
+		StringBuilder([]string{ColumnService, ColumnServiceName}): key.ServiceName,
+		StringBuilder([]string{ColumnService, ColumnAlias}):       key.Alias,
 	}
 	rangeIdx := strings.Index(key.Version, "-")
 	// if the version number is clear, need to add the version number to query
@@ -2547,7 +2547,7 @@ func servicesBasicFilter(ctx context.Context, key *discovery.MicroServiceKey) ([
 	case rangeIdx > 0:
 		return servicesFilter(ctx, filter)
 	default:
-		filter[StringBuilder([]string{ColumnServiceInfo, ColumnVersion})] = key.Version
+		filter[StringBuilder([]string{ColumnService, ColumnVersion})] = key.Version
 		return servicesFilter(ctx, filter)
 	}
 }
@@ -2561,25 +2561,25 @@ func findServices(ctx context.Context, key *discovery.MicroServiceKey) ([]*Servi
 	filter := bson.M{
 		ColumnDomain:  tenant[0],
 		ColumnProject: tenant[1],
-		StringBuilder([]string{ColumnServiceInfo, ColumnEnv}):         key.Environment,
-		StringBuilder([]string{ColumnServiceInfo, ColumnAppID}):       key.AppId,
-		StringBuilder([]string{ColumnServiceInfo, ColumnServiceName}): key.ServiceName,
-		StringBuilder([]string{ColumnServiceInfo, ColumnAlias}):       key.Alias,
+		StringBuilder([]string{ColumnService, ColumnEnv}):         key.Environment,
+		StringBuilder([]string{ColumnService, ColumnAppID}):       key.AppId,
+		StringBuilder([]string{ColumnService, ColumnServiceName}): key.ServiceName,
+		StringBuilder([]string{ColumnService, ColumnAlias}):       key.Alias,
 	}
 	switch {
 	case key.Version == "latest":
 		return latestServicesFilter(ctx, filter)
 	case len(key.Version) > 0 && key.Version[len(key.Version)-1:] == "+":
 		start := key.Version[:len(key.Version)-1]
-		filter[StringBuilder([]string{ColumnServiceInfo, ColumnVersion})] = bson.M{"$gte": start}
+		filter[StringBuilder([]string{ColumnService, ColumnVersion})] = bson.M{"$gte": start}
 		return servicesFilter(ctx, filter)
 	case rangeIdx > 0:
 		start := key.Version[:rangeIdx]
 		end := key.Version[rangeIdx+1:]
-		filter[StringBuilder([]string{ColumnServiceInfo, ColumnVersion})] = bson.M{"$gte": start, "$lte": end}
+		filter[StringBuilder([]string{ColumnService, ColumnVersion})] = bson.M{"$gte": start, "$lte": end}
 		return servicesFilter(ctx, filter)
 	default:
-		filter[StringBuilder([]string{ColumnServiceInfo, ColumnVersion})] = key.Version
+		filter[StringBuilder([]string{ColumnService, ColumnVersion})] = key.Version
 		return servicesFilter(ctx, filter)
 	}
 }
@@ -2589,8 +2589,8 @@ func instancesFilter(ctx context.Context, serviceIDs []string) ([]*discovery.Mic
 	if len(serviceIDs) == 0 {
 		return instances, nil
 	}
-	resp, err := client.GetMongoClient().Find(ctx, CollectionInstance, bson.M{StringBuilder([]string{ColumnInstanceInfo, ColumnServiceID}): bson.M{"$in": serviceIDs}}, &options.FindOptions{
-		Sort: bson.M{StringBuilder([]string{ColumnInstanceInfo, ColumnVersion}): -1}})
+	resp, err := client.GetMongoClient().Find(ctx, CollectionInstance, bson.M{StringBuilder([]string{ColumnInstance, ColumnServiceID}): bson.M{"$in": serviceIDs}}, &options.FindOptions{
+		Sort: bson.M{StringBuilder([]string{ColumnInstance, ColumnVersion}): -1}})
 	if err != nil {
 		return nil, err
 	}
@@ -2603,7 +2603,7 @@ func instancesFilter(ctx context.Context, serviceIDs []string) ([]*discovery.Mic
 		if err != nil {
 			return nil, err
 		}
-		instances = append(instances, instance.InstanceInfo)
+		instances = append(instances, instance.Instance)
 	}
 	return instances, nil
 }
@@ -2617,7 +2617,7 @@ func filterServiceIDs(ctx context.Context, consumerID string, tags []string, ser
 	filterService = tagsFilter(services, tags)
 	filterService = accessibleFilter(ctx, consumerID, filterService)
 	for _, service := range filterService {
-		serviceIDs = append(serviceIDs, service.ServiceInfo.ServiceId)
+		serviceIDs = append(serviceIDs, service.Service.ServiceId)
 	}
 	return serviceIDs
 }
@@ -2644,9 +2644,9 @@ func tagsFilter(services []*Service, tags []string) []*Service {
 func accessibleFilter(ctx context.Context, consumerID string, services []*Service) []*Service {
 	var newServices []*Service
 	for _, service := range services {
-		if err := accessible(ctx, consumerID, service.ServiceInfo.ServiceId); err != nil {
+		if err := accessible(ctx, consumerID, service.Service.ServiceId); err != nil {
 			findFlag := fmt.Sprintf("consumer '%s' find provider %s/%s/%s", consumerID,
-				service.ServiceInfo.AppId, service.ServiceInfo.ServiceName, service.ServiceInfo.Version)
+				service.Service.AppId, service.Service.ServiceName, service.Service.Version)
 			log.Error(fmt.Sprintf("accessible filter failed, %s", findFlag), err)
 			continue
 		}
@@ -2678,7 +2678,7 @@ func servicesFilter(ctx context.Context, filter bson.M) ([]*Service, error) {
 
 func latestServicesFilter(ctx context.Context, filter bson.M) ([]*Service, error) {
 	resp, err := client.GetMongoClient().Find(ctx, CollectionService, filter, &options.FindOptions{
-		Sort: bson.M{StringBuilder([]string{ColumnServiceInfo, ColumnVersion}): -1}})
+		Sort: bson.M{StringBuilder([]string{ColumnService, ColumnVersion}): -1}})
 	if err != nil {
 		return nil, err
 	}
@@ -2705,7 +2705,7 @@ func getTags(ctx context.Context, domain string, project string, serviceID strin
 	filter := bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnServiceInfo, ColumnServiceID}): serviceID,
+		StringBuilder([]string{ColumnService, ColumnServiceID}): serviceID,
 	}
 	result, err := client.GetMongoClient().FindOne(ctx, CollectionService, filter)
 	if err != nil {
@@ -2727,7 +2727,7 @@ func getService(ctx context.Context, domain string, project string, serviceID st
 	filter := bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnServiceInfo, ColumnServiceID}): serviceID,
+		StringBuilder([]string{ColumnService, ColumnServiceID}): serviceID,
 	}
 	result, err := client.GetMongoClient().FindOne(ctx, CollectionService, filter)
 	if err != nil {
@@ -2783,11 +2783,11 @@ func accessible(ctx context.Context, consumerID string, providerID string) *disc
 		return nil
 	}
 
-	validateTags, err := getTags(ctx, consumerDomain, consumerProject, consumerService.ServiceInfo.ServiceId)
+	validateTags, err := getTags(ctx, consumerDomain, consumerProject, consumerService.Service.ServiceId)
 	if err != nil {
 		return discovery.NewError(discovery.ErrInternal, fmt.Sprintf("an error occurred in query consumer tags(%s)", err.Error()))
 	}
-	return MatchRules(rules, consumerService.ServiceInfo, validateTags)
+	return MatchRules(rules, consumerService.Service, validateTags)
 }
 
 func MatchRules(rulesOfProvider []*Rule, consumer *discovery.MicroService, tagsOfConsumer map[string]string) *discovery.Error {
@@ -2798,7 +2798,7 @@ func MatchRules(rulesOfProvider []*Rule, consumer *discovery.MicroService, tagsO
 	if len(rulesOfProvider) <= 0 {
 		return nil
 	}
-	if rulesOfProvider[0].RuleInfo.RuleType == "WHITE" {
+	if rulesOfProvider[0].Rule.RuleType == "WHITE" {
 		return patternWhiteList(rulesOfProvider, tagsOfConsumer, consumer)
 	}
 	return patternBlackList(rulesOfProvider, tagsOfConsumer, consumer)
@@ -2827,7 +2827,7 @@ func patternWhiteList(rulesOfProvider []*Rule, tagsOfConsumer map[string]string,
 	v := reflect.Indirect(reflect.ValueOf(consumer))
 	consumerID := consumer.ServiceId
 	for _, rule := range rulesOfProvider {
-		value, err := parsePattern(v, rule.RuleInfo, tagsOfConsumer, consumerID)
+		value, err := parsePattern(v, rule.Rule, tagsOfConsumer, consumerID)
 		if err != nil {
 			return err
 		}
@@ -2835,11 +2835,11 @@ func patternWhiteList(rulesOfProvider []*Rule, tagsOfConsumer map[string]string,
 			continue
 		}
 
-		match, _ := regexp.MatchString(rule.RuleInfo.Pattern, value)
+		match, _ := regexp.MatchString(rule.Rule.Pattern, value)
 		if match {
 			log.Info(fmt.Sprintf("consumer[%s][%s/%s/%s/%s] match white list, rule.Pattern is %s, value is %s",
 				consumerID, consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version,
-				rule.RuleInfo.Pattern, value))
+				rule.Rule.Pattern, value))
 			return nil
 		}
 	}
@@ -2851,7 +2851,7 @@ func patternBlackList(rulesOfProvider []*Rule, tagsOfConsumer map[string]string,
 	consumerID := consumer.ServiceId
 	for _, rule := range rulesOfProvider {
 		var value string
-		value, err := parsePattern(v, rule.RuleInfo, tagsOfConsumer, consumerID)
+		value, err := parsePattern(v, rule.Rule, tagsOfConsumer, consumerID)
 		if err != nil {
 			return err
 		}
@@ -2859,11 +2859,11 @@ func patternBlackList(rulesOfProvider []*Rule, tagsOfConsumer map[string]string,
 			continue
 		}
 
-		match, _ := regexp.MatchString(rule.RuleInfo.Pattern, value)
+		match, _ := regexp.MatchString(rule.Rule.Pattern, value)
 		if match {
 			log.Warn(fmt.Sprintf("no permission to access, consumer[%s][%s/%s/%s/%s] match black list, rule.Pattern is %s, value is %s",
 				consumerID, consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version,
-				rule.RuleInfo.Pattern, value))
+				rule.Rule.Pattern, value))
 			return discovery.NewError(discovery.ErrPermissionDeny, "found in black list")
 		}
 	}
@@ -2898,17 +2898,17 @@ func getRulesUtil(ctx context.Context, domain string, project string, serviceID
 }
 
 func allowAcrossDimension(ctx context.Context, providerService *Service, consumerService *Service) error {
-	if providerService.ServiceInfo.AppId != consumerService.ServiceInfo.AppId {
-		if len(providerService.ServiceInfo.Properties) == 0 {
+	if providerService.Service.AppId != consumerService.Service.AppId {
+		if len(providerService.Service.Properties) == 0 {
 			return fmt.Errorf("not allow across app access")
 		}
 
-		if allowCrossApp, ok := providerService.ServiceInfo.Properties[discovery.PropAllowCrossApp]; !ok || strings.ToLower(allowCrossApp) != "true" {
+		if allowCrossApp, ok := providerService.Service.Properties[discovery.PropAllowCrossApp]; !ok || strings.ToLower(allowCrossApp) != "true" {
 			return fmt.Errorf("not allow across app access")
 		}
 	}
-	if !apt.IsGlobal(discovery.MicroServiceToKey(util.ParseTargetDomainProject(ctx), providerService.ServiceInfo)) &&
-		providerService.ServiceInfo.Environment != consumerService.ServiceInfo.Environment {
+	if !apt.IsGlobal(discovery.MicroServiceToKey(util.ParseTargetDomainProject(ctx), providerService.Service)) &&
+		providerService.Service.Environment != consumerService.Service.Environment {
 		return fmt.Errorf("not allow across environment access")
 	}
 	return nil
@@ -2936,7 +2936,7 @@ func GetAllInstancesOfOneService(ctx context.Context, serviceID string) ([]*disc
 		if err != nil {
 			return nil, err
 		}
-		instances = append(instances, tmp.InstanceInfo)
+		instances = append(instances, tmp.Instance)
 	}
 	return instances, nil
 }
@@ -2965,9 +2965,9 @@ func GeneratorServiceVersionsFilter(ctx context.Context, service *discovery.Micr
 	return bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnServiceInfo, ColumnEnv}):         service.Environment,
-		StringBuilder([]string{ColumnServiceInfo, ColumnAppID}):       service.AppId,
-		StringBuilder([]string{ColumnServiceInfo, ColumnServiceName}): service.ServiceName}
+		StringBuilder([]string{ColumnService, ColumnEnv}):         service.Environment,
+		StringBuilder([]string{ColumnService, ColumnAppID}):       service.AppId,
+		StringBuilder([]string{ColumnService, ColumnServiceName}): service.ServiceName}
 }
 
 func GeneratorServiceInstanceFilter(ctx context.Context, serviceID string) bson.M {
@@ -2976,7 +2976,7 @@ func GeneratorServiceInstanceFilter(ctx context.Context, serviceID string) bson.
 	return bson.M{
 		ColumnDomain:  domain,
 		ColumnProject: project,
-		StringBuilder([]string{ColumnInstanceInfo, ColumnServiceID}): serviceID}
+		StringBuilder([]string{ColumnInstance, ColumnServiceID}): serviceID}
 }
 
 func GetServiceByID(ctx context.Context, serviceID string) (*Service, error) {
@@ -2990,10 +2990,10 @@ func GetServiceByID(ctx context.Context, serviceID string) (*Service, error) {
 
 func cacheToService(service sd.Service) *Service {
 	return &Service{
-		Domain:      service.Domain,
-		Project:     service.Project,
-		Tags:        service.Tags,
-		ServiceInfo: service.ServiceInfo,
+		Domain:  service.Domain,
+		Project: service.Project,
+		Tags:    service.Tags,
+		Service: service.Service,
 	}
 }
 
@@ -3007,7 +3007,7 @@ func GetInstancesByServiceID(ctx context.Context, serviceID string) ([]*discover
 			cacheUnavailable = true
 			break
 		}
-		res = append(res, inst.InstanceInfo)
+		res = append(res, inst.Instance)
 	}
 	if cacheUnavailable || len(res) == 0 {
 		res, err := instancesFilter(ctx, []string{serviceID})
diff --git a/datasource/mongo/rule_util.go b/datasource/mongo/rule_util.go
index d7df917..640514e 100644
--- a/datasource/mongo/rule_util.go
+++ b/datasource/mongo/rule_util.go
@@ -40,7 +40,7 @@ func Filter(ctx context.Context, rules []*Rule, consumerID string) (bool, error)
 	if err != nil {
 		return false, err
 	}
-	matchErr := MatchRules(rules, consumer.ServiceInfo, tags)
+	matchErr := MatchRules(rules, consumer.Service, tags)
 	if matchErr != nil {
 		if matchErr.Code == discovery.ErrPermissionDeny {
 			return false, nil
diff --git a/datasource/mongo/sd/listwatch_inner.go b/datasource/mongo/sd/listwatch_inner.go
index a95c103..94b3030 100644
--- a/datasource/mongo/sd/listwatch_inner.go
+++ b/datasource/mongo/sd/listwatch_inner.go
@@ -130,9 +130,9 @@ func (lw *mongoListWatch) doParseDocumentToResource(fullDocument bson.Raw) (reso
 			log.Error("error to parse bson raw to documentInfo", err)
 			return
 		}
-		resource.Key = instance.InstanceInfo.InstanceId
+		resource.Key = instance.Instance.InstanceId
 		resource.Value = instance
-		resource.Index = instance.InstanceInfo.ServiceId
+		resource.Index = instance.Instance.ServiceId
 	case service:
 		service := Service{}
 		err := bson.Unmarshal(fullDocument, &service)
@@ -140,9 +140,9 @@ func (lw *mongoListWatch) doParseDocumentToResource(fullDocument bson.Raw) (reso
 			log.Error("error to parse bson raw to documentInfo", err)
 			return
 		}
-		resource.Key = service.ServiceInfo.ServiceId
+		resource.Key = service.Service.ServiceId
 		resource.Value = service
-		resource.Index = util.StringJoin([]string{service.Domain, service.Project, service.ServiceInfo.ServiceName, service.ServiceInfo.Version, service.ServiceInfo.AppId, service.ServiceInfo.Environment}, "/")
+		resource.Index = util.StringJoin([]string{service.Domain, service.Project, service.Service.ServiceName, service.Service.Version, service.Service.AppId, service.Service.Environment}, "/")
 	default:
 		return
 	}
diff --git a/datasource/mongo/sd/listwatch_test.go b/datasource/mongo/sd/listwatch_test.go
index ad0a03a..2e5a8b0 100644
--- a/datasource/mongo/sd/listwatch_test.go
+++ b/datasource/mongo/sd/listwatch_test.go
@@ -27,10 +27,10 @@ func TestListWatchConfig_String(t *testing.T) {
 func TestDoParseWatchRspToMongoInfo(t *testing.T) {
 	documentID := primitive.NewObjectID()
 
-	mockDocument, _ := bson.Marshal(bson.M{"_id": documentID, "domain": "default", "project": "default", "instanceinfo": bson.M{"instanceid": "8064a600438511eb8584fa163e8a81c9", "serviceid": "91afbe0faa9dc1594689139f099eb293b0cd048d",
+	mockDocument, _ := bson.Marshal(bson.M{"_id": documentID, "domain": "default", "project": "default", "instance": bson.M{"instanceid": "8064a600438511eb8584fa163e8a81c9", "serviceid": "91afbe0faa9dc1594689139f099eb293b0cd048d",
 		"hostname": "ecs-hcsadlab-dev-0002", "status": "UP", "timestamp": "1608552622", "modtimestamp": "1608552622", "version": "0.0.1"}})
 
-	mockServiceDocument, _ := bson.Marshal(bson.M{"_id": documentID, "domain": "default", "project": "default", "serviceinfo": bson.M{"serviceid": "91afbe0faa9dc1594689139f099eb293b0cd048d", "timestamp": "1608552622", "modtimestamp": "1608552622", "version": "0.0.1"}})
+	mockServiceDocument, _ := bson.Marshal(bson.M{"_id": documentID, "domain": "default", "project": "default", "service": bson.M{"serviceid": "91afbe0faa9dc1594689139f099eb293b0cd048d", "timestamp": "1608552622", "modtimestamp": "1608552622", "version": "0.0.1"}})
 
 	// case instance insertOp
 
@@ -50,7 +50,7 @@ func TestDoParseWatchRspToMongoInfo(t *testing.T) {
 	info = ilw.doParseWatchRspToResource(mockWatchRsp)
 	assert.Equal(t, documentID.Hex(), info.DocumentID)
 	assert.Equal(t, "8064a600438511eb8584fa163e8a81c9", info.Key)
-	assert.Equal(t, "1608552622", info.Value.(Instance).InstanceInfo.ModTimestamp)
+	assert.Equal(t, "1608552622", info.Value.(Instance).Instance.ModTimestamp)
 
 	// case delete
 	mockWatchRsp.OperationType = deleteOp
diff --git a/datasource/mongo/sd/mongo_cacher.go b/datasource/mongo/sd/mongo_cacher.go
index 891f274..16cf67b 100644
--- a/datasource/mongo/sd/mongo_cacher.go
+++ b/datasource/mongo/sd/mongo_cacher.go
@@ -368,19 +368,19 @@ func (c *MongoCacher) isValueNotUpdated(value interface{}, newValue interface{})
 	case instance:
 		instance := value.(Instance)
 		newInstance := newValue.(Instance)
-		if instance.InstanceInfo == nil || newInstance.InstanceInfo == nil {
+		if instance.Instance == nil || newInstance.Instance == nil {
 			return true
 		}
-		modTime = instance.InstanceInfo.ModTimestamp
-		newModTime = newInstance.InstanceInfo.ModTimestamp
+		modTime = instance.Instance.ModTimestamp
+		newModTime = newInstance.Instance.ModTimestamp
 	case service:
 		service := value.(Service)
 		newService := newValue.(Service)
-		if service.ServiceInfo == nil || newService.ServiceInfo == nil {
+		if service.Service == nil || newService.Service == nil {
 			return true
 		}
-		modTime = service.ServiceInfo.ModTimestamp
-		newModTime = newService.ServiceInfo.ModTimestamp
+		modTime = service.Service.ModTimestamp
+		newModTime = newService.Service.ModTimestamp
 	}
 
 	if newModTime == "" || modTime == newModTime {
diff --git a/datasource/mongo/sd/mongo_cacher_test.go b/datasource/mongo/sd/mongo_cacher_test.go
index 86f571f..700f549 100644
--- a/datasource/mongo/sd/mongo_cacher_test.go
+++ b/datasource/mongo/sd/mongo_cacher_test.go
@@ -102,7 +102,7 @@ func TestNewMongoCacher(t *testing.T) {
 
 	var resources []*sdcommon.Resource
 	resource := &sdcommon.Resource{Key: mockResourceID, DocumentID: mockDocumentID, Value: Instance{Domain: "default", Project: "default",
-		InstanceInfo: &pb.MicroServiceInstance{InstanceId: mockResourceID, ModTimestamp: "100000"}}}
+		Instance: &pb.MicroServiceInstance{InstanceId: mockResourceID, ModTimestamp: "100000"}}}
 	resources = append(resources, resource)
 	test := &sdcommon.ListWatchResp{
 		Action:    sdcommon.ActionCreate,
@@ -159,7 +159,7 @@ func TestNewMongoCacher(t *testing.T) {
 		// prepare updateOp data
 		dataUpdate := &sdcommon.Resource{Key: mockResourceID, DocumentID: mockDocumentID,
 			Value: Instance{Domain: "default", Project: "default",
-				InstanceInfo: &pb.MicroServiceInstance{InstanceId: mockResourceID, HostName: "test", ModTimestamp: "100001"}}}
+				Instance: &pb.MicroServiceInstance{InstanceId: mockResourceID, HostName: "test", ModTimestamp: "100001"}}}
 
 		var mongoUpdateResources []*sdcommon.Resource
 		mongoUpdateResources = append(mongoUpdateResources, dataUpdate)
@@ -252,7 +252,7 @@ func TestNewMongoCacher(t *testing.T) {
 		// prepare updateOp data
 		dataUpdate := &sdcommon.Resource{Key: mockResourceID, DocumentID: mockDocumentID,
 			Value: Instance{Domain: "default", Project: "default",
-				InstanceInfo: &pb.MicroServiceInstance{InstanceId: mockResourceID, HostName: "test", ModTimestamp: "100001"}}}
+				Instance: &pb.MicroServiceInstance{InstanceId: mockResourceID, HostName: "test", ModTimestamp: "100001"}}}
 
 		var mongoUpdateResources []*sdcommon.Resource
 		mongoUpdateResources = append(mongoUpdateResources, dataUpdate)
diff --git a/datasource/mongo/sd/types.go b/datasource/mongo/sd/types.go
index e5676e0..a5efe4e 100644
--- a/datasource/mongo/sd/types.go
+++ b/datasource/mongo/sd/types.go
@@ -90,15 +90,15 @@ type ResumeToken struct {
 }
 
 type Service struct {
-	Domain      string
-	Project     string
-	Tags        map[string]string
-	ServiceInfo *pb.MicroService
+	Domain  string
+	Project string
+	Tags    map[string]string
+	Service *pb.MicroService
 }
 
 type Instance struct {
-	Domain       string
-	Project      string
-	RefreshTime  time.Time
-	InstanceInfo *pb.MicroServiceInstance
+	Domain      string
+	Project     string
+	RefreshTime time.Time
+	Instance    *pb.MicroServiceInstance
 }
diff --git a/datasource/mongo/system.go b/datasource/mongo/system.go
index ab69149..1413bc4 100644
--- a/datasource/mongo/system.go
+++ b/datasource/mongo/system.go
@@ -51,7 +51,7 @@ func setServiceValue(e *sd.MongoCacher, setter dump.Setter) {
 		setter.SetValue(&dump.KV{
 			Key: util.StringJoin([]string{datasource.ServiceKeyPrefix, service.Domain, service.Project, k},
 				datasource.SPLIT),
-			Value: service.ServiceInfo,
+			Value: service.Service,
 		})
 		return true
 	})
@@ -62,8 +62,8 @@ func setInstanceValue(e *sd.MongoCacher, setter dump.Setter) {
 		instance := kv.(cache.Item).Object.(sd.Instance)
 		setter.SetValue(&dump.KV{
 			Key: util.StringJoin([]string{datasource.InstanceKeyPrefix, instance.Domain, instance.Project,
-				instance.InstanceInfo.ServiceId, k}, datasource.SPLIT),
-			Value: instance.InstanceInfo,
+				instance.Instance.ServiceId, k}, datasource.SPLIT),
+			Value: instance.Instance,
 		})
 		return true
 	})
diff --git a/datasource/mongo/util.go b/datasource/mongo/util.go
index cc2179b..8e07918 100644
--- a/datasource/mongo/util.go
+++ b/datasource/mongo/util.go
@@ -89,7 +89,7 @@ func statistics(ctx context.Context, withShared bool) (*pb.Statistics, error) {
 	}
 	var instIDs []string
 	for _, inst := range instances {
-		instIDs = append(instIDs, inst.InstanceInfo.ServiceId)
+		instIDs = append(instIDs, inst.Instance.ServiceId)
 	}
 	datasource.SetStaticInstances(result, svcIDToNonVerKey, instIDs)
 	data := <-respGetInstanceCountByDomain
diff --git a/etc/conf/app.conf b/etc/conf/app.conf
index 8f3ffbf..d40cc50 100644
--- a/etc/conf/app.conf
+++ b/etc/conf/app.conf
@@ -70,8 +70,6 @@ registry_plugin = etcd
 # manager_cluster = "127.0.0.1:2379"
 manager_cluster = "127.0.0.1:2379"
 
-# heartbeat_plugin="heartbeatchecker"
-heartbeat_plugin="heartbeatchecker"
 # heartbeat that sync synchronizes client's endpoints with the known endpoints from
 # the etcd membership, unit is second and value must greater then 1s, it is set
 # default 30s if value less then 0
diff --git a/etc/conf/app.yaml b/etc/conf/app.yaml
index fa4a551..82b2f50 100644
--- a/etc/conf/app.yaml
+++ b/etc/conf/app.yaml
@@ -83,6 +83,17 @@ registry:
     request:
       timeout:
   mongo:
+    heartbeat:
+      # Mongo's heartbeat plugin
+      # heartbeat.kind="checker or cache"
+      # if heartbeat.kind equals to 'cache', should set cacheCapacity,workerNum and taskTimeout
+      # capacity = 10000
+      # workerNum = 10
+      # timeout = 10
+      kind: cache
+      cacheCapacity: 10000
+      workerNum: 10
+      timeout: 10
     cluster:
       uri: mongodb://localhost:27017
 
diff --git a/test/test.go b/test/test.go
index 3639398..9ce76f1 100644
--- a/test/test.go
+++ b/test/test.go
@@ -39,7 +39,7 @@ func init() {
 		archaius.Set("discovery.kind", "etcd")
 		archaius.Set("registry.kind", "etcd")
 	} else {
-		archaius.Set("registry.heartbeat.kind", "heartbeatchecker")
+		archaius.Set("registry.heartbeat.kind", "checker")
 	}
 	datasource.Init(datasource.Options{PluginImplName: datasource.ImplName(t.(string))})
 	core.ServiceAPI, core.InstanceAPI = service.AssembleResources()