You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/08/16 05:02:28 UTC

[incubator-servicecomb-service-center] branch master updated: SCB-840 Support configable limit in buildin quota plugin (#414)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 873f62d  SCB-840 Support configable limit in buildin quota plugin (#414)
873f62d is described below

commit 873f62da1dbb789b6bef0455c194dec908723b18
Author: little-cui <su...@qq.com>
AuthorDate: Thu Aug 16 13:02:26 2018 +0800

    SCB-840 Support configable limit in buildin quota plugin (#414)
---
 pkg/util/sys.go                              |  14 ++
 pkg/util/util_test.go                        |  19 +++
 scripts/build/tools.sh                       |   5 +-
 server/infra/quota/quota.go                  |  19 ++-
 server/plugin/infra/quota/buildin/buildin.go | 197 +--------------------------
 server/plugin/infra/quota/buildin/common.go  | 108 +++++++++++++++
 server/plugin/infra/quota/unlimit/unlimit.go |   4 +
 server/service/microservice_test.go          |   4 +-
 server/service/rule_test.go                  |   6 +-
 server/service/schema_test.go                |   8 +-
 server/service/tag_test.go                   |  10 +-
 11 files changed, 180 insertions(+), 214 deletions(-)

diff --git a/pkg/util/sys.go b/pkg/util/sys.go
index 17052f9..7100e2e 100644
--- a/pkg/util/sys.go
+++ b/pkg/util/sys.go
@@ -18,6 +18,7 @@ package util
 
 import (
 	"os"
+	"strconv"
 	"unsafe"
 )
 
@@ -51,3 +52,16 @@ func HostName() (hostname string) {
 	}
 	return
 }
+
+func GetEnvInt(name string, def int) int {
+	env, ok := os.LookupEnv(name)
+	if ok {
+		i64, err := strconv.ParseInt(env, 10, 0)
+		if err != nil {
+			Logger().Errorf(err, "get env '%s' value failed, return default value '%d'", name, def)
+			return def
+		}
+		return int(i64)
+	}
+	return def
+}
diff --git a/pkg/util/util_test.go b/pkg/util/util_test.go
index 852851f..38c02e8 100644
--- a/pkg/util/util_test.go
+++ b/pkg/util/util_test.go
@@ -17,6 +17,7 @@
 package util
 
 import (
+	"os"
 	"testing"
 	"time"
 )
@@ -122,3 +123,21 @@ func TestSystemPackage(t *testing.T) {
 		t.Fatalf("TestSystemPackage failed")
 	}
 }
+
+func TestGetEnvInt(t *testing.T) {
+	if GetEnvInt("a", 1) != 1 {
+		t.Fatalf("TestGetEnvInt failed")
+	}
+	os.Setenv("a", "")
+	if GetEnvInt("a", 1) != 1 {
+		t.Fatalf("TestGetEnvInt failed")
+	}
+	os.Setenv("a", "x")
+	if GetEnvInt("a", 1) != 1 {
+		t.Fatalf("TestGetEnvInt failed")
+	}
+	os.Setenv("a", "2")
+	if GetEnvInt("a", 1) != 2 {
+		t.Fatalf("TestGetEnvInt failed")
+	}
+}
diff --git a/scripts/build/tools.sh b/scripts/build/tools.sh
index 5933711..dbf609d 100644
--- a/scripts/build/tools.sh
+++ b/scripts/build/tools.sh
@@ -126,7 +126,7 @@ package() {
 }
 
 docker_builder_pattern() {
-    local dockerfile=${1:-"."}
+    local dockerfile_dir=${1:-"."}
     local output=${2:-"."}
     local builder_name=servicecomb/service-center:build
     local builder_path=/go/src/github.com/apache/incubator-servicecomb-service-center
@@ -138,7 +138,8 @@ docker_builder_pattern() {
 
     set -e
 
-    docker build -t $builder_name . -f $dockerfile/Dockerfile.build
+    cd $dockerfile_dir
+    docker build -t $builder_name . -f Dockerfile.build
     docker create --name builder $builder_name
     docker cp builder:$builder_path/$app $output
     docker rm -f builder
diff --git a/server/infra/quota/quota.go b/server/infra/quota/quota.go
index bb37a45..b4f8bb4 100644
--- a/server/infra/quota/quota.go
+++ b/server/infra/quota/quota.go
@@ -17,15 +17,18 @@
 package quota
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
 	"golang.org/x/net/context"
 	"strconv"
 )
 
-var (
-	DefaultSchemaQuota = 0
-	DefaultTagQuota    = 0
-	DefaultRuleQuota   = 0
+const (
+	defaultServiceLimit  = 50000
+	defaultInstanceLimit = 150000
+	defaultSchemaLimit   = 100
+	defaultRuleLimit     = 100
+	defaultTagLimit      = 100
 )
 
 const (
@@ -37,6 +40,14 @@ const (
 	typeEnd
 )
 
+var (
+	DefaultServiceQuota  = util.GetEnvInt("QUOTA_SERVICE", defaultServiceLimit)
+	DefaultInstanceQuota = util.GetEnvInt("QUOTA_INSTANCE", defaultInstanceLimit)
+	DefaultSchemaQuota   = util.GetEnvInt("QUOTA_SCHEMA", defaultSchemaLimit)
+	DefaultTagQuota      = util.GetEnvInt("QUOTA_TAG", defaultTagLimit)
+	DefaultRuleQuota     = util.GetEnvInt("QUOTA_RULE", defaultRuleLimit)
+)
+
 type ApplyQuotaResult struct {
 	Reporter QuotaReporter
 	Err      *scerr.Error
diff --git a/server/plugin/infra/quota/buildin/buildin.go b/server/plugin/infra/quota/buildin/buildin.go
index f783725..0ca8316 100644
--- a/server/plugin/infra/quota/buildin/buildin.go
+++ b/server/plugin/infra/quota/buildin/buildin.go
@@ -17,38 +17,19 @@
 package buildin
 
 import (
-	"fmt"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
-	"github.com/apache/incubator-servicecomb-service-center/server/core"
-	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
-	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/quota"
-	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
 	mgr "github.com/apache/incubator-servicecomb-service-center/server/plugin"
-	serviceUtil "github.com/apache/incubator-servicecomb-service-center/server/service/util"
 	"golang.org/x/net/context"
-	"strings"
-)
-
-const (
-	SERVICE_NUM_MAX_LIMIT            = 50000
-	INSTANCE_NUM_MAX_LIMIT           = 150000
-	RULE_NUM_MAX_LIMIT_PER_SERVICE   = 100
-	SCHEMA_NUM_MAX_LIMIT_PER_SERVICE = 100
-	TAG_NUM_MAX_LIMIT_PER_SERVICE    = 100
 )
 
 func init() {
-	quota.DefaultSchemaQuota = SCHEMA_NUM_MAX_LIMIT_PER_SERVICE
-	quota.DefaultTagQuota = TAG_NUM_MAX_LIMIT_PER_SERVICE
-	quota.DefaultRuleQuota = RULE_NUM_MAX_LIMIT_PER_SERVICE
-
 	mgr.RegisterPlugin(mgr.Plugin{mgr.QUOTA, "buildin", New})
 }
 
 func New() mgr.PluginInstance {
 	util.Logger().Infof("quota init, service: %d, instance: %d, schema: %d/service, tag: %d/service, rule: %d/service",
-		SERVICE_NUM_MAX_LIMIT, INSTANCE_NUM_MAX_LIMIT,
+		quota.DefaultServiceQuota, quota.DefaultInstanceQuota,
 		quota.DefaultSchemaQuota, quota.DefaultTagQuota, quota.DefaultRuleQuota)
 	return &BuildInQuota{}
 }
@@ -63,18 +44,8 @@ func (q *BuildInQuota) Apply4Quotas(ctx context.Context, res *quota.ApplyQuotaRe
 		return df(ctx, res)
 	}
 
-	data := &QuotaApplyData{
-		domain:    strings.Split(res.DomainProject, "/")[0],
-		quotaSize: res.QuotaSize,
-	}
-	switch res.QuotaType {
-	case quota.MicroServiceInstanceQuotaType:
-		return instanceQuotaCheck(ctx, data)
-	case quota.MicroServiceQuotaType:
-		return serviceQuotaCheck(ctx, data)
-	default:
-		return ResourceLimitHandler(ctx, res)
-	}
+	return CommonQuotaCheck(ctx, res, resourceQuota(res.QuotaType), resourceLimitHandler)
+
 }
 
 //向配额中心上报配额使用量
@@ -85,165 +56,3 @@ func (q *BuildInQuota) RemandQuotas(ctx context.Context, quotaType quota.Resourc
 		return
 	}
 }
-
-func ResourceLimitHandler(ctx context.Context, res *quota.ApplyQuotaResource) *quota.ApplyQuotaResult {
-	var key string
-	var max int64 = 0
-	var indexer backend.Indexer
-
-	domainProject := res.DomainProject
-	serviceId := res.ServiceId
-	switch res.QuotaType {
-	case quota.RuleQuotaType:
-		key = core.GenerateServiceRuleKey(domainProject, serviceId, "")
-		max = int64(quota.DefaultRuleQuota)
-		indexer = backend.Store().Rule()
-	case quota.SchemaQuotaType:
-		key = core.GenerateServiceSchemaKey(domainProject, serviceId, "")
-		max = int64(quota.DefaultSchemaQuota)
-		indexer = backend.Store().Schema()
-	case quota.TagQuotaType:
-		applyNum := res.QuotaSize
-		max = int64(quota.DefaultTagQuota)
-		tags, err := serviceUtil.GetTagsUtils(ctx, domainProject, serviceId)
-		if err != nil {
-			return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrInternal, err.Error()))
-		}
-		curNum := int64(len(tags))
-		if curNum+applyNum > max {
-			mes := fmt.Sprintf("no quota to apply %s , max quota is %d, current used quota is %d, apply quota num is %d",
-				res.QuotaType, max, curNum, applyNum)
-			util.Logger().Errorf(nil, "%s, serviceId is %s", mes, serviceId)
-			return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrNotEnoughQuota, mes))
-		}
-		return quota.NewApplyQuotaResult(nil, nil)
-	default:
-		mes := fmt.Sprintf("not define quota type %s", res.QuotaType)
-		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrInternal, mes))
-	}
-
-	resp, err := indexer.Search(ctx,
-		registry.WithStrKey(key),
-		registry.WithPrefix(),
-		registry.WithCountOnly())
-	if err != nil {
-		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrInternal, err.Error()))
-	}
-	num := resp.Count + int64(res.QuotaSize)
-	util.Logger().Debugf("resource num is %d", num)
-	if num > max {
-		mes := fmt.Sprintf("no quota to apply %s, max quota is %d, current used quota is %d, apply quota num is %d",
-			res.QuotaType, max, resp.Count, res.QuotaSize)
-		util.Logger().Errorf(nil, "%s,  serviceId %s", mes, serviceId)
-		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrNotEnoughQuota, mes))
-	}
-	return quota.NewApplyQuotaResult(nil, nil)
-}
-
-type QuotaApplyData struct {
-	domain        string
-	project       string
-	domainProject string
-	quotaSize     int64
-}
-
-type GetCurUsedNum func(context.Context, *QuotaApplyData) (int64, error)
-type GetLimitQuota func() int64
-
-type QuotaCheckResult struct {
-	IsOk   bool
-	CurNum int64
-	Err    error
-}
-
-func NewQuotaCheckResult(isOk bool, curNum int64, err error) QuotaCheckResult {
-	return QuotaCheckResult{
-		isOk,
-		curNum,
-		err,
-	}
-}
-
-func quotaCheck(ctx context.Context, data *QuotaApplyData, getLimitQuota GetLimitQuota, getCurUsedNum GetCurUsedNum) QuotaCheckResult {
-	limitQuota := getLimitQuota()
-	curNum, err := getCurUsedNum(ctx, data)
-	if err != nil {
-		return NewQuotaCheckResult(false, 0, err)
-	}
-	if curNum+data.quotaSize > limitQuota {
-		return NewQuotaCheckResult(false, curNum, nil)
-	}
-	return NewQuotaCheckResult(true, curNum, nil)
-}
-
-func instanceQuotaCheck(ctx context.Context, data *QuotaApplyData) *quota.ApplyQuotaResult {
-	rst := quotaCheck(ctx, data, getInstanceMaxLimit, getAllInstancesNum)
-	err := rst.Err
-	if rst.Err != nil {
-		util.Logger().Errorf(rst.Err, "instance quota check failed")
-		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrInternal, err.Error()))
-	}
-	if !rst.IsOk {
-		mes := fmt.Sprintf("no quota to create instance, max num is %d, curNum is %d, apply num is %d",
-			getInstanceMaxLimit(), rst.CurNum, data.quotaSize)
-		util.Logger().Errorf(nil, mes)
-		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrNotEnoughQuota, mes))
-	}
-	return quota.NewApplyQuotaResult(nil, nil)
-}
-
-func getInstanceMaxLimit() int64 {
-	return INSTANCE_NUM_MAX_LIMIT
-}
-
-func getInstancesNum(ctx context.Context, key string) (int64, error) {
-	resp, err := backend.Store().Instance().Search(ctx,
-		registry.WithStrKey(key),
-		registry.WithPrefix(),
-		registry.WithCountOnly())
-	if err != nil {
-		return 0, err
-	}
-	return resp.Count, nil
-}
-
-func getAllInstancesNum(ctx context.Context, data *QuotaApplyData) (int64, error) {
-	key := core.GetInstanceRootKey("")
-	return getInstancesNum(ctx, key)
-}
-
-func serviceQuotaCheck(ctx context.Context, data *QuotaApplyData) *quota.ApplyQuotaResult {
-	rst := quotaCheck(ctx, data, getServiceMaxLimit, getAllServicesNum)
-	err := rst.Err
-	if err != nil {
-		util.Logger().Errorf(err, "service quota check failed")
-		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrInternal, err.Error()))
-	}
-	if !rst.IsOk {
-		mes := fmt.Sprintf("no quota to create service, max quota is %d, current used quota is %d, apply quota num is %d",
-			getServiceMaxLimit(), rst.CurNum, data.quotaSize)
-		util.Logger().Errorf(err, mes)
-		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrNotEnoughQuota, mes))
-	}
-	return quota.NewApplyQuotaResult(nil, nil)
-}
-
-func getServiceMaxLimit() int64 {
-	return SERVICE_NUM_MAX_LIMIT
-}
-
-func getServicesNum(ctx context.Context, key string) (int64, error) {
-	resp, err := backend.Store().Service().Search(ctx,
-		registry.WithStrKey(key),
-		registry.WithPrefix(),
-		registry.WithCountOnly())
-	if err != nil {
-		return 0, err
-	}
-	return resp.Count, nil
-}
-
-func getAllServicesNum(ctx context.Context, data *QuotaApplyData) (int64, error) {
-	key := core.GetServiceRootKey("")
-	return getServicesNum(ctx, key)
-}
diff --git a/server/plugin/infra/quota/buildin/common.go b/server/plugin/infra/quota/buildin/common.go
new file mode 100644
index 0000000..5b269e1
--- /dev/null
+++ b/server/plugin/infra/quota/buildin/common.go
@@ -0,0 +1,108 @@
+/*
+ * 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 buildin
+
+import (
+	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/server/core"
+	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
+	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
+	"github.com/apache/incubator-servicecomb-service-center/server/infra/quota"
+	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
+	serviceUtil "github.com/apache/incubator-servicecomb-service-center/server/service/util"
+	"golang.org/x/net/context"
+)
+
+type GetCurUsedNum func(context.Context, *quota.ApplyQuotaResource) (int64, error)
+type GetLimitQuota func() int64
+
+func CommonQuotaCheck(ctx context.Context, res *quota.ApplyQuotaResource,
+	getLimitQuota GetLimitQuota, getCurUsedNum GetCurUsedNum) *quota.ApplyQuotaResult {
+	limitQuota := getLimitQuota()
+	curNum, err := getCurUsedNum(ctx, res)
+	if err != nil {
+		util.Logger().Errorf(err, "%s quota check failed", res.QuotaType)
+		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrInternal, err.Error()))
+	}
+	if curNum+res.QuotaSize > limitQuota {
+		mes := fmt.Sprintf("no quota to create %s, max num is %d, curNum is %d, apply num is %d",
+			res.QuotaType, limitQuota, curNum, res.QuotaSize)
+		util.Logger().Errorf(nil, mes)
+		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrNotEnoughQuota, mes))
+	}
+	return quota.NewApplyQuotaResult(nil, nil)
+}
+
+func resourceQuota(t quota.ResourceType) GetLimitQuota {
+	return func() int64 {
+		switch t {
+		case quota.MicroServiceInstanceQuotaType:
+			return int64(quota.DefaultInstanceQuota)
+		case quota.MicroServiceQuotaType:
+			return int64(quota.DefaultServiceQuota)
+		case quota.RuleQuotaType:
+			return int64(quota.DefaultRuleQuota)
+		case quota.SchemaQuotaType:
+			return int64(quota.DefaultSchemaQuota)
+		case quota.TagQuotaType:
+			return int64(quota.DefaultTagQuota)
+		default:
+			return 0
+		}
+	}
+}
+
+func resourceLimitHandler(ctx context.Context, res *quota.ApplyQuotaResource) (int64, error) {
+	var key string
+	var indexer backend.Indexer
+
+	domainProject := res.DomainProject
+	serviceId := res.ServiceId
+
+	switch res.QuotaType {
+	case quota.MicroServiceInstanceQuotaType:
+		key = core.GetInstanceRootKey("")
+		indexer = backend.Store().Instance()
+	case quota.MicroServiceQuotaType:
+		key = core.GetServiceRootKey("")
+		indexer = backend.Store().Service()
+	case quota.RuleQuotaType:
+		key = core.GenerateServiceRuleKey(domainProject, serviceId, "")
+		indexer = backend.Store().Rule()
+	case quota.SchemaQuotaType:
+		key = core.GenerateServiceSchemaKey(domainProject, serviceId, "")
+		indexer = backend.Store().Schema()
+	case quota.TagQuotaType:
+		tags, err := serviceUtil.GetTagsUtils(ctx, domainProject, serviceId)
+		if err != nil {
+			return 0, err
+		}
+		return int64(len(tags)), nil
+	default:
+		return 0, fmt.Errorf("not define quota type '%s'", res.QuotaType)
+	}
+
+	resp, err := indexer.Search(ctx,
+		registry.WithStrKey(key),
+		registry.WithPrefix(),
+		registry.WithCountOnly())
+	if err != nil {
+		return 0, err
+	}
+	return resp.Count, nil
+}
diff --git a/server/plugin/infra/quota/unlimit/unlimit.go b/server/plugin/infra/quota/unlimit/unlimit.go
index 5aa4b0b..b640ec1 100644
--- a/server/plugin/infra/quota/unlimit/unlimit.go
+++ b/server/plugin/infra/quota/unlimit/unlimit.go
@@ -17,6 +17,7 @@
 package unlimit
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/quota"
 	mgr "github.com/apache/incubator-servicecomb-service-center/server/plugin"
 	"github.com/astaxie/beego"
@@ -30,6 +31,8 @@ func init() {
 	if quataType != "unlimit" {
 		return
 	}
+	quota.DefaultServiceQuota = 0
+	quota.DefaultInstanceQuota = 0
 	quota.DefaultSchemaQuota = 0
 	quota.DefaultTagQuota = 0
 	quota.DefaultRuleQuota = 0
@@ -39,6 +42,7 @@ type Unlimit struct {
 }
 
 func New() mgr.PluginInstance {
+	util.Logger().Infof("quota init, all resources are unlimited")
 	return &Unlimit{}
 }
 
diff --git a/server/service/microservice_test.go b/server/service/microservice_test.go
index 213ed4d..edbfbdf 100644
--- a/server/service/microservice_test.go
+++ b/server/service/microservice_test.go
@@ -20,7 +20,7 @@ import (
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
-	"github.com/apache/incubator-servicecomb-service-center/server/plugin/infra/quota/buildin"
+	"github.com/apache/incubator-servicecomb-service-center/server/infra/quota"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 	"strconv"
@@ -52,7 +52,7 @@ var _ = Describe("'Micro-service' service", func() {
 
 		Context("all max", func() {
 			It("should be passed", func() {
-				size := buildin.SCHEMA_NUM_MAX_LIMIT_PER_SERVICE + 1
+				size := quota.DefaultSchemaQuota + 1
 				paths := make([]*pb.ServicePath, 0, size)
 				properties := make(map[string]string, size)
 				for i := 0; i < size; i++ {
diff --git a/server/service/rule_test.go b/server/service/rule_test.go
index 6dbe837..051b1f4 100644
--- a/server/service/rule_test.go
+++ b/server/service/rule_test.go
@@ -19,7 +19,7 @@ package service_test
 import (
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
-	"github.com/apache/incubator-servicecomb-service-center/server/plugin/infra/quota/buildin"
+	"github.com/apache/incubator-servicecomb-service-center/server/infra/quota"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 	"strconv"
@@ -200,7 +200,7 @@ var _ = Describe("'Rule' service", func() {
 
 		Context("when create rule out of gauge", func() {
 			It("should be failed", func() {
-				size := buildin.RULE_NUM_MAX_LIMIT_PER_SERVICE + 1
+				size := quota.DefaultRuleQuota + 1
 				rules := make([]*pb.AddOrUpdateServiceRule, 0, size)
 				for i := 0; i < size; i++ {
 					rules = append(rules, &pb.AddOrUpdateServiceRule{
@@ -536,7 +536,7 @@ var _ = Describe("'Rule' service", func() {
 
 				By("rules is invalid")
 				var arr []string
-				for i := 0; i < buildin.RULE_NUM_MAX_LIMIT_PER_SERVICE+1; i++ {
+				for i := 0; i < quota.DefaultRuleQuota+1; i++ {
 					arr = append(arr, strconv.Itoa(i))
 				}
 				respAddRule, err = serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
diff --git a/server/service/schema_test.go b/server/service/schema_test.go
index 2137f9d..b79ef06 100644
--- a/server/service/schema_test.go
+++ b/server/service/schema_test.go
@@ -19,7 +19,7 @@ package service_test
 import (
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
-	"github.com/apache/incubator-servicecomb-service-center/server/plugin/infra/quota/buildin"
+	"github.com/apache/incubator-servicecomb-service-center/server/infra/quota"
 	"github.com/apache/incubator-servicecomb-service-center/server/service"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
@@ -208,7 +208,7 @@ var _ = Describe("'Schema' service", func() {
 		})
 
 		Context("when create schemas out of gauge", func() {
-			size := buildin.SCHEMA_NUM_MAX_LIMIT_PER_SERVICE + 1
+			size := quota.DefaultSchemaQuota + 1
 			schemaIds := make([]string, 0, size)
 			schemas := make([]*pb.Schema, 0, size)
 			for i := 0; i < size; i++ {
@@ -234,14 +234,14 @@ var _ = Describe("'Schema' service", func() {
 				By("batch modify schemas 2")
 				respCreateSchemas, err = serviceResource.ModifySchemas(getContext(), &pb.ModifySchemasRequest{
 					ServiceId: serviceIdDev,
-					Schemas:   schemas[:buildin.SCHEMA_NUM_MAX_LIMIT_PER_SERVICE],
+					Schemas:   schemas[:quota.DefaultSchemaQuota],
 				})
 				Expect(err).To(BeNil())
 				Expect(respCreateSchemas.Response.Code).To(Equal(pb.Response_SUCCESS))
 
 				By("modify one schema")
 				respCreateService := &pb.ModifySchemaResponse{}
-				schema := schemas[buildin.SCHEMA_NUM_MAX_LIMIT_PER_SERVICE]
+				schema := schemas[quota.DefaultSchemaQuota]
 				respCreateService, err = serviceResource.ModifySchema(getContext(), &pb.ModifySchemaRequest{
 					ServiceId: serviceIdDev,
 					SchemaId:  schema.SchemaId,
diff --git a/server/service/tag_test.go b/server/service/tag_test.go
index 322ce9b..8396eac 100644
--- a/server/service/tag_test.go
+++ b/server/service/tag_test.go
@@ -19,7 +19,7 @@ package service_test
 import (
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
-	"github.com/apache/incubator-servicecomb-service-center/server/plugin/infra/quota/buildin"
+	"github.com/apache/incubator-servicecomb-service-center/server/infra/quota"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 	"strconv"
@@ -106,7 +106,7 @@ var _ = Describe("'Tag' service", func() {
 		Context("when request is valid", func() {
 			It("should be passed", func() {
 				By("all max")
-				size := buildin.TAG_NUM_MAX_LIMIT_PER_SERVICE
+				size := quota.DefaultRuleQuota
 				tags := make(map[string]string, size)
 				for i := 0; i < size; i++ {
 					s := "tag" + strconv.Itoa(i)
@@ -123,7 +123,7 @@ var _ = Describe("'Tag' service", func() {
 
 		Context("when create tag out of gauge", func() {
 			It("should be failed", func() {
-				size := buildin.TAG_NUM_MAX_LIMIT_PER_SERVICE + 1
+				size := quota.DefaultRuleQuota + 1
 				tags := make(map[string]string, size)
 				for i := 0; i < size; i++ {
 					s := "tag" + strconv.Itoa(i)
@@ -136,7 +136,7 @@ var _ = Describe("'Tag' service", func() {
 				Expect(err).To(BeNil())
 				Expect(respAddTags.Response.Code).To(Equal(scerr.ErrInvalidParams))
 
-				size = buildin.TAG_NUM_MAX_LIMIT_PER_SERVICE / 2
+				size = quota.DefaultRuleQuota / 2
 				tags = make(map[string]string, size)
 				for i := 0; i < size; i++ {
 					s := "tag" + strconv.Itoa(i)
@@ -513,7 +513,7 @@ var _ = Describe("'Tag' service", func() {
 				Expect(respAddTags.Response.Code).To(Equal(scerr.ErrInvalidParams))
 
 				var arr []string
-				for i := 0; i < buildin.TAG_NUM_MAX_LIMIT_PER_SERVICE+1; i++ {
+				for i := 0; i < quota.DefaultRuleQuota+1; i++ {
 					arr = append(arr, strconv.Itoa(i))
 				}
 				respAddTags, err = serviceResource.DeleteTags(getContext(), &pb.DeleteServiceTagsRequest{