You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ti...@apache.org on 2020/11/28 00:55:09 UTC

[servicecomb-service-center] branch master updated: SCB-2094 Bug fixes (#764)

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 d198992  SCB-2094 Bug fixes (#764)
d198992 is described below

commit d19899224b8103862dbc650e14639cc7ef881264
Author: little-cui <su...@qq.com>
AuthorDate: Sat Nov 28 08:55:00 2020 +0800

    SCB-2094 Bug fixes (#764)
    
    * SCB-2094 Bug fixes
    
    * SCB-2094 Bug fixes
    
    * SCB-2094 Bug fixes
---
 datasource/etcd/cache/filter_consistency.go       |  3 +-
 datasource/etcd/engine.go                         | 85 ++++++++++++-----------
 datasource/etcd/engine_test.go                    |  4 +-
 datasource/etcd/etcd_suite_test.go                |  8 +--
 datasource/etcd/event/dependency_event_handler.go |  4 +-
 datasource/etcd/event/instance_event_handler.go   |  4 +-
 datasource/etcd/event/rule_event_handler.go       |  4 +-
 datasource/etcd/event/tag_event_handler.go        |  4 +-
 datasource/etcd/ms.go                             | 12 ++--
 datasource/etcd/ms_test.go                        | 10 +--
 datasource/etcd/util/dependency_util.go           |  2 +-
 datasource/etcd/util/domain_util.go               |  2 +-
 datasource/etcd/util/instance_util_test.go        | 12 ++--
 datasource/etcd/util/microservice_util.go         |  6 +-
 datasource/etcd/util/rule_util.go                 |  4 +-
 datasource/etcd/util/rule_util_test.go            |  2 +-
 datasource/etcd/util/util_suite_test.go           |  6 +-
 datasource/mongo/mongo_suite_test.go              |  4 +-
 pkg/util/context.go                               | 20 ++++++
 server/api.go                                     |  3 +
 server/broker/service_test.go                     |  6 +-
 server/core/microservice.go                       |  8 +--
 server/rest/admin/service_test.go                 |  4 +-
 server/rest/govern/govern_suite_test.go           |  4 +-
 server/rest/govern/service.go                     |  5 +-
 server/service/instance_test.go                   |  4 +-
 server/service/service_suite_test.go              |  4 +-
 27 files changed, 116 insertions(+), 118 deletions(-)

diff --git a/datasource/etcd/cache/filter_consistency.go b/datasource/etcd/cache/filter_consistency.go
index 3987f9c..b7d1987 100644
--- a/datasource/etcd/cache/filter_consistency.go
+++ b/datasource/etcd/cache/filter_consistency.go
@@ -63,8 +63,7 @@ func (f *ConsistencyFilter) Init(ctx context.Context, parent *cache.Node) (node
 		return
 	}
 
-	cloneCtx := util.CloneContext(ctx)
-	cloneCtx = util.SetContext(cloneCtx, util.CtxNocache, "1")
+	cloneCtx := util.WithNoCache(util.CloneContext(ctx))
 	insts, _, err := f.Find(cloneCtx, parent)
 	if err != nil {
 		pCache.InitBrokenQueue()
diff --git a/datasource/etcd/engine.go b/datasource/etcd/engine.go
index 426543c..685a04b 100644
--- a/datasource/etcd/engine.go
+++ b/datasource/etcd/engine.go
@@ -24,7 +24,6 @@ import (
 	"github.com/apache/servicecomb-service-center/datasource/etcd/path"
 	"github.com/apache/servicecomb-service-center/pkg/cluster"
 	"github.com/apache/servicecomb-service-center/pkg/gopool"
-	"github.com/apache/servicecomb-service-center/server/metrics"
 	"strconv"
 	"strings"
 	"time"
@@ -37,20 +36,25 @@ import (
 )
 
 func (ds *DataSource) SelfRegister(ctx context.Context) error {
-	err := ds.registryService(ctx)
+	err := ds.selfRegister(ctx)
 	if err != nil {
 		return err
 	}
-	// 实例信息
-	err = ds.registryInstance(ctx)
 	// start send heart beat job
 	ds.autoSelfHeartBeat()
-	// report the metrics
-	metrics.ReportScInstance()
-	return err
+	return nil
+}
+
+func (ds *DataSource) selfRegister(ctx context.Context) error {
+	err := ds.registerService(ctx)
+	if err != nil {
+		return err
+	}
+	// 实例信息
+	return ds.registerInstance(ctx)
 }
 
-func (ds *DataSource) registryService(pCtx context.Context) error {
+func (ds *DataSource) registerService(pCtx context.Context) error {
 	ctx := core.AddDefaultContextValue(pCtx)
 	respE, err := core.ServiceAPI.Exist(ctx, core.GetExistenceRequest())
 	if err != nil {
@@ -78,7 +82,7 @@ func (ds *DataSource) registryService(pCtx context.Context) error {
 	return nil
 }
 
-func (ds *DataSource) registryInstance(pCtx context.Context) error {
+func (ds *DataSource) registerInstance(pCtx context.Context) error {
 	core.Instance.InstanceId = ""
 	core.Instance.ServiceId = core.Service.ServiceId
 
@@ -101,32 +105,11 @@ func (ds *DataSource) registryInstance(pCtx context.Context) error {
 	return nil
 }
 
-func (ds *DataSource) SelfUnregister(pCtx context.Context) error {
-	if len(core.Instance.InstanceId) == 0 {
-		return nil
-	}
-	ctx := core.AddDefaultContextValue(pCtx)
-	respI, err := core.InstanceAPI.Unregister(ctx, core.UnregisterInstanceRequest())
-	if err != nil {
-		log.Error("unregister failed", err)
-		return err
-	}
-	if respI.Response.GetCode() != pb.ResponseSuccess {
-		err = fmt.Errorf("unregister service center instance[%s/%s] failed, %s",
-			core.Instance.ServiceId, core.Instance.InstanceId, respI.Response.GetMessage())
-		log.Error(err.Error(), nil)
-		return err
-	}
-	log.Warnf("unregister service center instance[%s/%s]",
-		core.Service.ServiceId, core.Instance.InstanceId)
-	return nil
-}
-
 func (ds *DataSource) selfHeartBeat(pCtx context.Context) error {
 	ctx := core.AddDefaultContextValue(pCtx)
 	respI, err := core.InstanceAPI.Heartbeat(ctx, core.HeartbeatRequest())
 	if err != nil {
-		log.Error("sen heartbeat failed", err)
+		log.Error("send heartbeat failed", err)
 		return err
 	}
 	if respI.Response.GetCode() == pb.ResponseSuccess {
@@ -134,15 +117,9 @@ func (ds *DataSource) selfHeartBeat(pCtx context.Context) error {
 			core.Instance.ServiceId, core.Instance.InstanceId)
 		return nil
 	}
+	err = fmt.Errorf(respI.Response.GetMessage())
 	log.Errorf(err, "update service center instance[%s/%s] heartbeat failed",
 		core.Instance.ServiceId, core.Instance.InstanceId)
-
-	//服务不存在,创建服务
-	err = ds.SelfRegister(pCtx)
-	if err != nil {
-		log.Errorf(err, "retry to register[%s/%s/%s/%s] failed",
-			core.Service.Environment, core.Service.AppId, core.Service.ServiceName, core.Service.Version)
-	}
 	return err
 }
 
@@ -153,12 +130,42 @@ func (ds *DataSource) autoSelfHeartBeat() {
 			case <-ctx.Done():
 				return
 			case <-time.After(time.Duration(core.Instance.HealthCheck.Interval) * time.Second):
-				_ = ds.selfHeartBeat(ctx)
+				err := ds.selfHeartBeat(ctx)
+				if err == nil {
+					continue
+				}
+				//服务不存在,创建服务
+				err = ds.selfRegister(ctx)
+				if err != nil {
+					log.Errorf(err, "retry to register[%s/%s/%s/%s] failed",
+						core.Service.Environment, core.Service.AppId, core.Service.ServiceName, core.Service.Version)
+				}
 			}
 		}
 	})
 }
 
+func (ds *DataSource) SelfUnregister(pCtx context.Context) error {
+	if len(core.Instance.InstanceId) == 0 {
+		return nil
+	}
+	ctx := core.AddDefaultContextValue(pCtx)
+	respI, err := core.InstanceAPI.Unregister(ctx, core.UnregisterInstanceRequest())
+	if err != nil {
+		log.Error("unregister failed", err)
+		return err
+	}
+	if respI.Response.GetCode() != pb.ResponseSuccess {
+		err = fmt.Errorf("unregister service center instance[%s/%s] failed, %s",
+			core.Instance.ServiceId, core.Instance.InstanceId, respI.Response.GetMessage())
+		log.Error(err.Error(), nil)
+		return err
+	}
+	log.Warnf("unregister service center instance[%s/%s]",
+		core.Service.ServiceId, core.Instance.InstanceId)
+	return nil
+}
+
 // ClearNoInstanceService clears services which have no instance
 func (ds *DataSource) ClearNoInstanceServices(ctx context.Context, serviceTTL time.Duration) error {
 	services, err := serviceUtil.GetAllServicesAcrossDomainProject(ctx)
diff --git a/datasource/etcd/engine_test.go b/datasource/etcd/engine_test.go
index eaf9218..e5142f0 100644
--- a/datasource/etcd/engine_test.go
+++ b/datasource/etcd/engine_test.go
@@ -42,9 +42,7 @@ type serviceCleanInfo struct {
 }
 
 func getContextWith(domain string, project string) context.Context {
-	return util.SetContext(
-		util.SetDomainProject(context.Background(), domain, project),
-		util.CtxNocache, "1")
+	return util.WithNoCache(util.SetDomainProject(context.Background(), domain, project))
 }
 
 func createService(domain string, project string, name string, withInstance bool, shouldClear bool) {
diff --git a/datasource/etcd/etcd_suite_test.go b/datasource/etcd/etcd_suite_test.go
index 24f0f64..0c1ac71 100644
--- a/datasource/etcd/etcd_suite_test.go
+++ b/datasource/etcd/etcd_suite_test.go
@@ -38,15 +38,11 @@ var _ = BeforeSuite(func() {
 })
 
 func getContext() context.Context {
-	return util.SetContext(
-		util.SetDomainProject(context.Background(), "default", "default"),
-		util.CtxNocache, "1")
+	return util.WithNoCache(util.SetDomainProject(context.Background(), "default", "default"))
 }
 
 func depGetContext() context.Context {
-	return util.SetContext(
-		util.SetDomainProject(context.Background(), "new_default", "new_default"),
-		util.CtxNocache, "1")
+	return util.WithNoCache(util.SetDomainProject(context.Background(), "new_default", "new_default"))
 }
 
 func TestEtcd(t *testing.T) {
diff --git a/datasource/etcd/event/dependency_event_handler.go b/datasource/etcd/event/dependency_event_handler.go
index bc1d0bb..c204845 100644
--- a/datasource/etcd/event/dependency_event_handler.go
+++ b/datasource/etcd/event/dependency_event_handler.go
@@ -174,7 +174,7 @@ func (h *DependencyEventHandler) Handle() error {
 }
 
 func (h *DependencyEventHandler) dependencyRuleHandle(res interface{}) error {
-	ctx := context.WithValue(context.Background(), util.CtxGlobal, "1")
+	ctx := util.WithGlobal(context.Background())
 	dependencyEventHandlerRes := res.(*DependencyEventHandlerResource)
 	r := dependencyEventHandlerRes.dep
 	consumerFlag := util.StringJoin([]string{r.Consumer.Environment, r.Consumer.AppId, r.Consumer.ServiceName, r.Consumer.Version}, "/")
@@ -223,7 +223,7 @@ func (h *DependencyEventHandler) removeKV(ctx context.Context, kv *sd.KeyValue)
 
 func (h *DependencyEventHandler) CleanUp(domainProjects map[string]struct{}) {
 	for domainProject := range domainProjects {
-		ctx := context.WithValue(context.Background(), util.CtxGlobal, "1")
+		ctx := util.WithGlobal(context.Background())
 		if err := serviceUtil.CleanUpDependencyRules(ctx, domainProject); err != nil {
 			log.Errorf(err, "clean up '%s' dependency rules failed", domainProject)
 		}
diff --git a/datasource/etcd/event/instance_event_handler.go b/datasource/etcd/event/instance_event_handler.go
index 381cdb2..1990687 100644
--- a/datasource/etcd/event/instance_event_handler.go
+++ b/datasource/etcd/event/instance_event_handler.go
@@ -90,9 +90,7 @@ func (h *InstanceEventHandler) OnEvent(evt sd.KvEvent) {
 	}
 
 	// 查询服务版本信息
-	ctx := context.WithValue(context.WithValue(context.Background(),
-		util.CtxCacheOnly, "1"),
-		util.CtxGlobal, "1")
+	ctx := util.WithGlobal(util.WithCacheOnly(context.Background()))
 	ms, err := serviceUtil.GetService(ctx, domainProject, providerID)
 	if ms == nil {
 		log.Errorf(err, "caught [%s] instance[%s/%s] event, endpoints %v, get cached provider's file failed",
diff --git a/datasource/etcd/event/rule_event_handler.go b/datasource/etcd/event/rule_event_handler.go
index 397b21b..f5c3a55 100644
--- a/datasource/etcd/event/rule_event_handler.go
+++ b/datasource/etcd/event/rule_event_handler.go
@@ -55,9 +55,7 @@ func (apt *RulesChangedTask) Err() error {
 }
 
 func (apt *RulesChangedTask) publish(ctx context.Context, domainProject, providerID string) error {
-	ctx = context.WithValue(context.WithValue(ctx,
-		util.CtxCacheOnly, "1"),
-		util.CtxGlobal, "1")
+	ctx = util.WithGlobal(util.WithCacheOnly(ctx))
 
 	provider, err := serviceUtil.GetService(ctx, domainProject, providerID)
 	if err != nil {
diff --git a/datasource/etcd/event/tag_event_handler.go b/datasource/etcd/event/tag_event_handler.go
index 957c20e..d406dd9 100644
--- a/datasource/etcd/event/tag_event_handler.go
+++ b/datasource/etcd/event/tag_event_handler.go
@@ -56,9 +56,7 @@ func (apt *TagsChangedTask) Err() error {
 }
 
 func (apt *TagsChangedTask) publish(ctx context.Context, domainProject, consumerID string) error {
-	ctx = context.WithValue(context.WithValue(ctx,
-		util.CtxCacheOnly, "1"),
-		util.CtxGlobal, "1")
+	ctx = util.WithGlobal(util.WithCacheOnly(ctx))
 
 	consumer, err := serviceUtil.GetService(ctx, domainProject, consumerID)
 	if err != nil {
diff --git a/datasource/etcd/ms.go b/datasource/etcd/ms.go
index 6c7bc56..76b40d8 100644
--- a/datasource/etcd/ms.go
+++ b/datasource/etcd/ms.go
@@ -268,7 +268,7 @@ func (ds *DataSource) GetServiceDetail(ctx context.Context, request *pb.GetServi
 
 func (ds *DataSource) GetServicesInfo(ctx context.Context, request *pb.GetServicesInfoRequest) (
 	*pb.GetServicesInfoResponse, error) {
-	ctx = util.SetContext(ctx, util.CtxCacheOnly, "1")
+	ctx = util.WithCacheOnly(ctx)
 
 	optionMap := make(map[string]struct{}, len(request.Options))
 	for _, opt := range request.Options {
@@ -737,7 +737,7 @@ func (ds *DataSource) GetInstance(ctx context.Context, request *pb.GetOneInstanc
 	if rev == item.Rev {
 		instance = nil // for gRPC
 	}
-	_ = util.SetContext(ctx, util.CtxResponseRevision, item.Rev)
+	_ = util.WithResponseRev(ctx, item.Rev)
 
 	return &pb.GetOneInstanceResponse{
 		Response: pb.CreateResponse(pb.ResponseSuccess, "Get instance successfully."),
@@ -817,7 +817,7 @@ func (ds *DataSource) GetInstances(ctx context.Context, request *pb.GetInstances
 	if rev == item.Rev {
 		instances = nil // for gRPC
 	}
-	_ = util.SetContext(ctx, util.CtxResponseRevision, item.Rev)
+	_ = util.WithResponseRev(ctx, item.Rev)
 
 	return &pb.GetInstancesResponse{
 		Response:  pb.CreateResponse(pb.ResponseSuccess, "Query service instances successfully."),
@@ -1022,7 +1022,7 @@ func (ds *DataSource) genFindResult(ctx context.Context, oldRev string, item *ca
 		instances = nil // for gRPC
 	}
 	// TODO support gRPC output context
-	_ = util.SetContext(ctx, util.CtxResponseRevision, item.Rev)
+	_ = util.WithResponseRev(ctx, item.Rev)
 	return &pb.FindInstancesResponse{
 		Response:  pb.CreateResponse(pb.ResponseSuccess, "Query service instances successfully."),
 		Instances: instances,
@@ -1204,7 +1204,7 @@ func (ds *DataSource) batchFindServices(ctx context.Context, request *pb.BatchFi
 	services := &pb.BatchFindResult{}
 	failedResult := make(map[int32]*pb.FindFailedResult)
 	for index, key := range request.Services {
-		findCtx := util.SetContext(cloneCtx, util.CtxRequestRevision, key.Rev)
+		findCtx := util.WithRequestRev(cloneCtx, key.Rev)
 		resp, err := ds.FindInstances(findCtx, &pb.FindInstancesRequest{
 			ConsumerServiceId: request.ConsumerServiceId,
 			AppId:             key.Service.AppId,
@@ -1239,7 +1239,7 @@ func (ds *DataSource) batchFindInstances(ctx context.Context, request *pb.BatchF
 	instances := &pb.BatchFindResult{}
 	failedResult := make(map[int32]*pb.FindFailedResult)
 	for index, key := range request.Instances {
-		getCtx := util.SetContext(cloneCtx, util.CtxRequestRevision, key.Rev)
+		getCtx := util.WithRequestRev(cloneCtx, key.Rev)
 		resp, err := ds.GetInstance(getCtx, &pb.GetOneInstanceRequest{
 			ConsumerServiceId:  request.ConsumerServiceId,
 			ProviderServiceId:  key.Instance.ServiceId,
diff --git a/datasource/etcd/ms_test.go b/datasource/etcd/ms_test.go
index 80b0f5b..531b57d 100644
--- a/datasource/etcd/ms_test.go
+++ b/datasource/etcd/ms_test.go
@@ -1409,7 +1409,7 @@ func TestInstance_Query(t *testing.T) {
 		assert.Equal(t, instanceId8, respFind.Instances[0].InstanceId)
 		assert.NotEqual(t, 0, len(rev))
 
-		util.SetContext(ctx, util.CtxRequestRevision, "x")
+		util.WithRequestRev(ctx, "x")
 		respFind, err = datasource.Instance().FindInstances(ctx, &pb.FindInstancesRequest{
 			ConsumerServiceId: serviceId8,
 			AppId:             "query_instance_ms",
@@ -1888,9 +1888,7 @@ func TestInstance_GetAll(t *testing.T) {
 			serviceId1 string
 			serviceId2 string
 		)
-		ctx := util.SetContext(
-			util.SetDomainProject(context.Background(), "TestInstance_GetAll", "1"),
-			util.CtxNocache, "1")
+		ctx := util.WithNoCache(util.SetDomainProject(context.Background(), "TestInstance_GetAll", "1"))
 		respCreateService, err := datasource.Instance().RegisterService(ctx, &pb.CreateServiceRequest{
 			Service: &pb.MicroService{
 				AppId:       "get_instance_ms",
@@ -1950,9 +1948,7 @@ func TestInstance_GetAll(t *testing.T) {
 	})
 
 	t.Run("domain contain no instances, get all instances should be pass, return 0 instance", func(t *testing.T) {
-		ctx := util.SetContext(
-			util.SetDomainProject(context.Background(), "TestInstance_GetAll", "2"),
-			util.CtxNocache, "1")
+		ctx := util.WithNoCache(util.SetDomainProject(context.Background(), "TestInstance_GetAll", "2"))
 		respAll, err := datasource.Instance().GetAllInstances(ctx, &pb.GetAllInstancesRequest{})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respAll.Response.GetCode())
diff --git a/datasource/etcd/util/dependency_util.go b/datasource/etcd/util/dependency_util.go
index d851f37..9e62924 100644
--- a/datasource/etcd/util/dependency_util.go
+++ b/datasource/etcd/util/dependency_util.go
@@ -96,7 +96,7 @@ func GetAllProviderIds(ctx context.Context, domainProject string, service *pb.Mi
 	}
 	allowIdx, denyIdx := 0, l
 	providerIDs := make([]string, l)
-	copyCtx := util.SetContext(util.CloneContext(ctx), util.CtxCacheOnly, "1")
+	copyCtx := util.WithCacheOnly(util.CloneContext(ctx))
 	for _, providerID := range providerIDsInCache {
 		providerRules, err := GetRulesUtil(copyCtx, domainProject, providerID)
 		if err != nil {
diff --git a/datasource/etcd/util/domain_util.go b/datasource/etcd/util/domain_util.go
index a8ec78a..5c0a06f 100644
--- a/datasource/etcd/util/domain_util.go
+++ b/datasource/etcd/util/domain_util.go
@@ -105,7 +105,7 @@ func ProjectExist(ctx context.Context, domain, project string) (bool, error) {
 }
 
 func NewDomainProject(ctx context.Context, domain, project string) error {
-	copyCtx := util.SetContext(util.CloneContext(ctx), util.CtxCacheOnly, "1")
+	copyCtx := util.WithCacheOnly(util.CloneContext(ctx))
 	ok, err := DomainExist(copyCtx, domain)
 	if !ok && err == nil {
 		ok, err = AddDomain(ctx, domain)
diff --git a/datasource/etcd/util/instance_util_test.go b/datasource/etcd/util/instance_util_test.go
index 7ead196..35bef49 100644
--- a/datasource/etcd/util/instance_util_test.go
+++ b/datasource/etcd/util/instance_util_test.go
@@ -88,7 +88,7 @@ func TestGetInstanceCountOfOneService(t *testing.T) {
 }
 
 func TestUpdateInstance(t *testing.T) {
-	err := UpdateInstance(util.SetContext(context.Background(), util.CtxNocache, "1"), "", &pb.MicroServiceInstance{})
+	err := UpdateInstance(util.WithNoCache(context.Background()), "", &pb.MicroServiceInstance{})
 	if err == nil {
 		t.Fatalf(`UpdateInstance CTX_NOCACHE failed`)
 	}
@@ -111,7 +111,7 @@ func TestAppendFindResponse(t *testing.T) {
 	}
 
 	updatedResult = nil
-	cloneCtx := context.WithValue(ctx, util.CtxResponseRevision, "1")
+	cloneCtx := util.WithResponseRev(ctx, "1")
 	AppendFindResponse(cloneCtx, 1, find.Response, find.Instances, &updatedResult, &notModifiedResult, &failedResult)
 	if updatedResult == nil || notModifiedResult != nil || failedResult != nil {
 		t.Fatal("TestAppendFindResponse failed")
@@ -121,8 +121,8 @@ func TestAppendFindResponse(t *testing.T) {
 	}
 
 	updatedResult = nil
-	cloneCtx = context.WithValue(ctx, util.CtxRequestRevision, "1")
-	cloneCtx = context.WithValue(cloneCtx, util.CtxResponseRevision, "1")
+	cloneCtx = util.WithRequestRev(ctx, "1")
+	cloneCtx = util.WithResponseRev(cloneCtx, "1")
 	AppendFindResponse(cloneCtx, 1, find.Response, find.Instances, &updatedResult, &notModifiedResult, &failedResult)
 	if updatedResult != nil || notModifiedResult == nil || failedResult != nil {
 		t.Fatal("TestAppendFindResponse failed")
@@ -153,8 +153,8 @@ func TestAppendFindResponse(t *testing.T) {
 	find.Response = nil
 	AppendFindResponse(ctx, 1, find.Response, find.Instances, &updatedResult, &notModifiedResult, &failedResult)
 	AppendFindResponse(ctx, 2, find.Response, find.Instances, &updatedResult, &notModifiedResult, &failedResult)
-	cloneCtx = context.WithValue(ctx, util.CtxRequestRevision, "1")
-	cloneCtx = context.WithValue(cloneCtx, util.CtxResponseRevision, "1")
+	cloneCtx = util.WithRequestRev(ctx, "1")
+	cloneCtx = util.WithResponseRev(cloneCtx, "1")
 	AppendFindResponse(cloneCtx, 3, find.Response, find.Instances, &updatedResult, &notModifiedResult, &failedResult)
 	AppendFindResponse(cloneCtx, 4, find.Response, find.Instances, &updatedResult, &notModifiedResult, &failedResult)
 	find.Response = pb.CreateResponse(pb.ErrInternal, "test")
diff --git a/datasource/etcd/util/microservice_util.go b/datasource/etcd/util/microservice_util.go
index 003b35c..b9a4321 100644
--- a/datasource/etcd/util/microservice_util.go
+++ b/datasource/etcd/util/microservice_util.go
@@ -32,8 +32,6 @@ import (
 	pb "github.com/go-chassis/cari/discovery"
 )
 
-const defaultCacheValue = "1"
-
 /*
 	get Service by service id
 */
@@ -66,9 +64,7 @@ func GetService(ctx context.Context, domainProject string, serviceID string) (*p
 
 // GetServiceFromCache gets service from cache
 func GetServiceFromCache(domainProject string, serviceID string) *pb.MicroService {
-	ctx := context.WithValue(context.WithValue(context.Background(),
-		util.CtxCacheOnly, defaultCacheValue),
-		util.CtxGlobal, defaultCacheValue)
+	ctx := util.WithGlobal(util.WithCacheOnly(context.Background()))
 	svc, _ := GetService(ctx, domainProject, serviceID)
 	return svc
 }
diff --git a/datasource/etcd/util/rule_util.go b/datasource/etcd/util/rule_util.go
index 12c7c36..eb2cf70 100644
--- a/datasource/etcd/util/rule_util.go
+++ b/datasource/etcd/util/rule_util.go
@@ -39,7 +39,7 @@ type RuleFilter struct {
 }
 
 func (rf *RuleFilter) Filter(ctx context.Context, consumerID string) (bool, error) {
-	copyCtx := util.SetContext(util.CloneContext(ctx), util.CtxCacheOnly, "1")
+	copyCtx := util.WithCacheOnly(util.CloneContext(ctx))
 	consumer, err := GetService(copyCtx, rf.DomainProject, consumerID)
 	if consumer == nil {
 		return false, err
@@ -278,7 +278,7 @@ func Accessible(ctx context.Context, consumerID string, providerID string) *disc
 		return discovery.NewError(discovery.ErrPermissionDeny, err.Error())
 	}
 
-	ctx = util.SetContext(util.CloneContext(ctx), util.CtxCacheOnly, "1")
+	ctx = util.WithCacheOnly(util.CloneContext(ctx))
 
 	// 黑白名单
 	rules, err := GetRulesUtil(ctx, targetDomainProject, providerID)
diff --git a/datasource/etcd/util/rule_util_test.go b/datasource/etcd/util/rule_util_test.go
index db5718e..ba72871 100644
--- a/datasource/etcd/util/rule_util_test.go
+++ b/datasource/etcd/util/rule_util_test.go
@@ -67,7 +67,7 @@ func TestRuleExist(t *testing.T) {
 			t.Fatalf("TestRuleExist panic")
 		}
 	}()
-	RuleExist(util.SetContext(context.Background(), util.CtxCacheOnly, "1"), "", "", "", "")
+	RuleExist(util.WithCacheOnly(context.Background()), "", "", "", "")
 	RuleExist(context.Background(), "", "", "", "")
 }
 
diff --git a/datasource/etcd/util/util_suite_test.go b/datasource/etcd/util/util_suite_test.go
index d014c28..56fa8a8 100644
--- a/datasource/etcd/util/util_suite_test.go
+++ b/datasource/etcd/util/util_suite_test.go
@@ -94,11 +94,11 @@ func TestServiceExist(t *testing.T) {
 			t.Fatalf("TestServiceExist failed")
 		}
 	}()
-	serviceUtil.ServiceExist(util.SetContext(context.Background(), util.CtxCacheOnly, "1"), "", "")
+	serviceUtil.ServiceExist(util.WithCacheOnly(context.Background()), "", "")
 }
 
 func TestFromContext(t *testing.T) {
-	ctx := context.WithValue(context.Background(), util.CtxNocache, "1")
+	ctx := util.WithNoCache(context.Background())
 	opts := serviceUtil.FromContext(ctx)
 	if len(opts) == 0 {
 		t.Fatalf("TestFromContext failed")
@@ -109,7 +109,7 @@ func TestFromContext(t *testing.T) {
 		t.Fatalf("TestFromContext failed")
 	}
 
-	ctx = context.WithValue(context.Background(), util.CtxCacheOnly, "1")
+	ctx = util.WithCacheOnly(context.Background())
 	opts = serviceUtil.FromContext(ctx)
 	if len(opts) == 0 {
 		t.Fatalf("TestFromContext failed")
diff --git a/datasource/mongo/mongo_suite_test.go b/datasource/mongo/mongo_suite_test.go
index 015c0f0..557f350 100644
--- a/datasource/mongo/mongo_suite_test.go
+++ b/datasource/mongo/mongo_suite_test.go
@@ -40,9 +40,7 @@ var _ = BeforeSuite(func() {
 })
 
 func getContext() context.Context {
-	return util.SetContext(
-		util.SetDomainProject(context.Background(), "default", "default"),
-		util.CtxNocache, "1")
+	return util.WithNoCache(util.SetDomainProject(context.Background(), "default", "default"))
 }
 
 func TestMongo(t *testing.T) {
diff --git a/pkg/util/context.go b/pkg/util/context.go
index 7fbec0c..220af73 100644
--- a/pkg/util/context.go
+++ b/pkg/util/context.go
@@ -181,3 +181,23 @@ func SetDomainProject(ctx context.Context, domain string, project string) contex
 func SetTargetDomainProject(ctx context.Context, domain string, project string) context.Context {
 	return SetTargetProject(SetTargetDomain(ctx, domain), project)
 }
+
+func WithNoCache(ctx context.Context) context.Context {
+	return SetContext(ctx, CtxNocache, "1")
+}
+
+func WithCacheOnly(ctx context.Context) context.Context {
+	return SetContext(ctx, CtxCacheOnly, "1")
+}
+
+func WithGlobal(ctx context.Context) context.Context {
+	return SetContext(ctx, CtxGlobal, "1")
+}
+
+func WithRequestRev(ctx context.Context, rev string) context.Context {
+	return SetContext(ctx, CtxRequestRevision, rev)
+}
+
+func WithResponseRev(ctx context.Context, rev string) context.Context {
+	return SetContext(ctx, CtxResponseRevision, rev)
+}
diff --git a/server/api.go b/server/api.go
index f368a29..e33b5a3 100644
--- a/server/api.go
+++ b/server/api.go
@@ -27,6 +27,7 @@ import (
 	"github.com/apache/servicecomb-service-center/pkg/rest"
 	"github.com/apache/servicecomb-service-center/server/config"
 	"github.com/apache/servicecomb-service-center/server/core"
+	"github.com/apache/servicecomb-service-center/server/metrics"
 	rs "github.com/apache/servicecomb-service-center/server/rest"
 	"github.com/apache/servicecomb-service-center/server/service"
 	"net"
@@ -193,6 +194,8 @@ func (s *APIServer) selfRegister() {
 		s.err <- err
 		return
 	}
+	// report the metrics
+	metrics.ReportScInstance()
 }
 
 func (s *APIServer) selfUnregister() {
diff --git a/server/broker/service_test.go b/server/broker/service_test.go
index d19d077..17618ef 100644
--- a/server/broker/service_test.go
+++ b/server/broker/service_test.go
@@ -236,8 +236,8 @@ var _ = Describe("Controller", func() {
 
 func getContext() context.Context {
 	ctx := context.TODO()
-	ctx = util.SetContext(ctx, "domain", "default")
-	ctx = util.SetContext(ctx, "project", "default")
-	ctx = util.SetContext(ctx, util.CtxNocache, "1")
+	ctx = util.SetDomain(ctx, "default")
+	ctx = util.SetProject(ctx, "default")
+	ctx = util.WithNoCache(ctx)
 	return ctx
 }
diff --git a/server/core/microservice.go b/server/core/microservice.go
index f67ecd0..4db4d8d 100644
--- a/server/core/microservice.go
+++ b/server/core/microservice.go
@@ -48,8 +48,7 @@ const (
 	RegistryDefaultLeaseRenewalinterval int32 = 30
 	RegistryDefaultLeaseRetrytimes      int32 = 3
 
-	CtxScSelf     = "_sc_self"
-	CtxScRegistry = "_registryOnly"
+	CtxScSelf = "_sc_self"
 )
 
 func init() {
@@ -88,10 +87,9 @@ func prepareSelfRegistration() {
 }
 
 func AddDefaultContextValue(ctx context.Context) context.Context {
-	return util.SetContext(util.SetContext(util.SetDomainProject(ctx,
+	return util.WithNoCache(util.SetContext(util.SetDomainProject(ctx,
 		RegistryDomain, RegistryProject),
-		CtxScSelf, true),
-		CtxScRegistry, "1")
+		CtxScSelf, true))
 }
 
 func IsDefaultDomainProject(domainProject string) bool {
diff --git a/server/rest/admin/service_test.go b/server/rest/admin/service_test.go
index ea77ede..cd4ab4f 100644
--- a/server/rest/admin/service_test.go
+++ b/server/rest/admin/service_test.go
@@ -46,7 +46,5 @@ func TestAdminService_Dump(t *testing.T) {
 }
 
 func getContext() context.Context {
-	return util.SetContext(
-		util.SetDomainProject(context.Background(), "default", "default"),
-		util.CtxNocache, "1")
+	return util.WithNoCache(util.SetDomainProject(context.Background(), "default", "default"))
 }
diff --git a/server/rest/govern/govern_suite_test.go b/server/rest/govern/govern_suite_test.go
index 82d032f..0eed7e8 100644
--- a/server/rest/govern/govern_suite_test.go
+++ b/server/rest/govern/govern_suite_test.go
@@ -43,7 +43,5 @@ var _ = BeforeSuite(func() {
 })
 
 func getContext() context.Context {
-	return util.SetContext(
-		util.SetDomainProject(context.Background(), "default", "default"),
-		util.CtxNocache, "1")
+	return util.WithNoCache(util.SetDomainProject(context.Background(), "default", "default"))
 }
diff --git a/server/rest/govern/service.go b/server/rest/govern/service.go
index 866edea..1700847 100644
--- a/server/rest/govern/service.go
+++ b/server/rest/govern/service.go
@@ -32,13 +32,12 @@ type Service struct {
 }
 
 func (governService *Service) GetServicesInfo(ctx context.Context, in *pb.GetServicesInfoRequest) (*pb.GetServicesInfoResponse, error) {
-	ctx = util.SetContext(ctx, util.CtxCacheOnly, "1")
-
+	ctx = util.WithCacheOnly(ctx)
 	return datasource.Instance().GetServicesInfo(ctx, in)
 }
 
 func (governService *Service) GetServiceDetail(ctx context.Context, in *pb.GetServiceRequest) (*pb.GetServiceDetailResponse, error) {
-	ctx = util.SetContext(ctx, util.CtxCacheOnly, "1")
+	ctx = util.WithCacheOnly(ctx)
 
 	if len(in.ServiceId) == 0 {
 		return &pb.GetServiceDetailResponse{
diff --git a/server/service/instance_test.go b/server/service/instance_test.go
index a198941..f8fa29f 100644
--- a/server/service/instance_test.go
+++ b/server/service/instance_test.go
@@ -1575,7 +1575,7 @@ var _ = Describe("'Instance' service", func() {
 				Expect(respFind.Instances[0].InstanceId).To(Equal(instanceId8))
 				Expect(len(rev)).NotTo(Equal(0))
 
-				util.SetContext(ctx, util.CtxRequestRevision, "x")
+				util.WithRequestRev(ctx, "x")
 				respFind, err = instanceResource.Find(ctx, &pb.FindInstancesRequest{
 					ConsumerServiceId: serviceId8,
 					AppId:             "query_instance",
@@ -1587,7 +1587,7 @@ var _ = Describe("'Instance' service", func() {
 				Expect(respFind.Instances[0].InstanceId).To(Equal(instanceId8))
 				Expect(ctx.Value(util.CtxResponseRevision)).To(Equal(rev))
 
-				util.SetContext(ctx, util.CtxRequestRevision, rev)
+				util.WithRequestRev(ctx, rev)
 				respFind, err = instanceResource.Find(ctx, &pb.FindInstancesRequest{
 					ConsumerServiceId: serviceId8,
 					AppId:             "query_instance",
diff --git a/server/service/service_suite_test.go b/server/service/service_suite_test.go
index 9740f64..ae8ead5 100644
--- a/server/service/service_suite_test.go
+++ b/server/service/service_suite_test.go
@@ -37,9 +37,7 @@ var _ = BeforeSuite(func() {
 })
 
 func getContext() context.Context {
-	return util.SetContext(
-		util.SetDomainProject(context.Background(), "default", "default"),
-		util.CtxNocache, "1")
+	return util.WithNoCache(util.SetDomainProject(context.Background(), "default", "default"))
 }
 
 func TestGrpc(t *testing.T) {