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 b6fc7f6  [SCB-2094] Add configuration changes for service instance and 
schema (#912)
b6fc7f6 is described below

commit b6fc7f675f2e3ff34d0e9250b37cf3543820b420
Author: robotLJW <[email protected]>
AuthorDate: Thu Mar 25 14:24:41 2021 +0800

    [SCB-2094] Add configuration changes for service instance and schema (#912)
---
 datasource/etcd/ms.go                              |  34 +------
 datasource/etcd/util.go                            |  14 +--
 .../mongo/{event/event.go => client/dao/domain.go} |  25 +++--
 .../{event/event.go => client/dao/project.go}      |  22 +++--
 datasource/mongo/client/model/types.go             |  11 +++
 datasource/mongo/event/event.go                    |   7 ++
 datasource/mongo/event/instance_event_handler.go   |  12 +++
 .../{event.go => schema_summary_event_handler.go}  |  30 +++++-
 datasource/mongo/event/service_event_handler.go    | 107 +++++++++++++++++++++
 datasource/mongo/ms.go                             |   9 +-
 etc/conf/app.yaml                                  |   7 ++
 server/plugin/quota/quota.go                       |  10 +-
 server/service/instance.go                         |  31 +++++-
 server/service/microservice.go                     |  32 +++++-
 14 files changed, 276 insertions(+), 75 deletions(-)

diff --git a/datasource/etcd/ms.go b/datasource/etcd/ms.go
index 34aad64..f9e3902 100644
--- a/datasource/etcd/ms.go
+++ b/datasource/etcd/ms.go
@@ -25,6 +25,8 @@ import (
        "strconv"
        "time"
 
+       pb "github.com/go-chassis/cari/discovery"
+
        "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/datasource/etcd/cache"
        "github.com/apache/servicecomb-service-center/datasource/etcd/client"
@@ -39,7 +41,6 @@ import (
        "github.com/apache/servicecomb-service-center/server/core"
        "github.com/apache/servicecomb-service-center/server/plugin/quota"
        "github.com/apache/servicecomb-service-center/server/plugin/uuid"
-       pb "github.com/go-chassis/cari/discovery"
 )
 
 // RegisterService() implement:
@@ -63,19 +64,6 @@ func (ds *DataSource) RegisterService(ctx context.Context, 
request *pb.CreateSer
                Version:     service.Version,
        }
 
-       Err := checkQuota(ctx, domainProject)
-       if Err != nil {
-               log.Error(fmt.Sprintf("create micro-service[%s] failed, 
operator: %s",
-                       serviceFlag, remoteIP), Err)
-               resp := &pb.CreateServiceResponse{
-                       Response: pb.CreateResponseWithSCErr(Err),
-               }
-               if Err.InternalError() {
-                       return resp, Err
-               }
-               return resp, nil
-       }
-
        index := path.GenerateServiceIndexKey(serviceKey)
 
        // 产生全局service id
@@ -573,24 +561,6 @@ func (ds *DataSource) RegisterInstance(ctx 
context.Context, request *pb.Register
        //先以domain/project的方式组装
        domainProject := util.ParseDomainProject(ctx)
 
-       if !core.IsSCInstance(ctx) {
-               res := quota.NewApplyQuotaResource(quota.TypeInstance,
-                       domainProject, request.Instance.ServiceId, 1)
-               applyErr := quota.Apply(ctx, res)
-
-               if applyErr != nil {
-                       log.Error(fmt.Sprintf("register instance failed, %s, 
operator %s",
-                               instanceFlag, remoteIP), applyErr)
-                       response := &pb.RegisterInstanceResponse{
-                               Response: pb.CreateResponseWithSCErr(applyErr),
-                       }
-                       if applyErr.InternalError() {
-                               return response, applyErr
-                       }
-                       return response, nil
-               }
-       }
-
        instanceID := instance.InstanceId
        data, err := json.Marshal(instance)
        if err != nil {
diff --git a/datasource/etcd/util.go b/datasource/etcd/util.go
index 497b69a..a157a9d 100644
--- a/datasource/etcd/util.go
+++ b/datasource/etcd/util.go
@@ -23,6 +23,8 @@ import (
        "strings"
        "time"
 
+       pb "github.com/go-chassis/cari/discovery"
+
        "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/datasource/etcd/client"
        "github.com/apache/servicecomb-service-center/datasource/etcd/kv"
@@ -33,9 +35,7 @@ import (
        "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/util"
        "github.com/apache/servicecomb-service-center/server/core"
-       "github.com/apache/servicecomb-service-center/server/plugin/quota"
        "github.com/apache/servicecomb-service-center/server/plugin/uuid"
-       pb "github.com/go-chassis/cari/discovery"
 )
 
 type ServiceDetailOpt struct {
@@ -462,13 +462,3 @@ func toDependencyFilterOptions(in 
*pb.GetDependenciesRequest) (opts []serviceUti
        }
        return opts
 }
-
-func checkQuota(ctx context.Context, domainProject string) *pb.Error {
-       if core.IsSCInstance(ctx) {
-               log.Debugf("skip quota check")
-               return nil
-       }
-       res := quota.NewApplyQuotaResource(quota.TypeService, domainProject, 
"", 1)
-       rst := quota.Apply(ctx, res)
-       return rst
-}
diff --git a/datasource/mongo/event/event.go 
b/datasource/mongo/client/dao/domain.go
similarity index 62%
copy from datasource/mongo/event/event.go
copy to datasource/mongo/client/dao/domain.go
index 528e8a2..6e3cd1f 100644
--- a/datasource/mongo/event/event.go
+++ b/datasource/mongo/client/dao/domain.go
@@ -15,15 +15,28 @@
  * limitations under the License.
  */
 
-package event
+package dao
 
 import (
-       "github.com/apache/servicecomb-service-center/datasource/mongo/sd"
+       "context"
+       "fmt"
+
+       "github.com/apache/servicecomb-service-center/datasource/mongo/client"
+       
"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
        "github.com/apache/servicecomb-service-center/pkg/log"
 )
 
-func init() {
-       log.Info("event init")
-       instanceEventHandler := NewInstanceEventHandler()
-       
sd.EventProxy(instanceEventHandler.Type()).AddHandleFunc(instanceEventHandler.OnEvent)
+func AddDomain(ctx context.Context, domain string) error {
+       d := model.Domain{
+               Domain: domain,
+       }
+       result, err := client.GetMongoClient().Insert(ctx, 
model.CollectionDomain, d)
+       if err == nil {
+               log.Info(fmt.Sprintf("insert domain to mongodb success %s", 
result.InsertedID))
+       }
+       return err
+}
+
+func ExistDomain(ctx context.Context, filter interface{}) (bool, error) {
+       return client.GetMongoClient().DocExist(ctx, model.CollectionDomain, 
filter)
 }
diff --git a/datasource/mongo/event/event.go 
b/datasource/mongo/client/dao/project.go
similarity index 63%
copy from datasource/mongo/event/event.go
copy to datasource/mongo/client/dao/project.go
index 528e8a2..296ca41 100644
--- a/datasource/mongo/event/event.go
+++ b/datasource/mongo/client/dao/project.go
@@ -15,15 +15,25 @@
  * limitations under the License.
  */
 
-package event
+package dao
 
 import (
-       "github.com/apache/servicecomb-service-center/datasource/mongo/sd"
+       "context"
+       "fmt"
+
+       "github.com/apache/servicecomb-service-center/datasource/mongo/client"
+       
"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
        "github.com/apache/servicecomb-service-center/pkg/log"
 )
 
-func init() {
-       log.Info("event init")
-       instanceEventHandler := NewInstanceEventHandler()
-       
sd.EventProxy(instanceEventHandler.Type()).AddHandleFunc(instanceEventHandler.OnEvent)
+func AddProject(ctx context.Context, project model.Project) error {
+       result, err := client.GetMongoClient().Insert(ctx, 
model.CollectionProject, project)
+       if err == nil {
+               log.Info(fmt.Sprintf("insert project to mongodb success %s", 
result.InsertedID))
+       }
+       return err
+}
+
+func ExistProject(ctx context.Context, filter interface{}) (bool, error) {
+       return client.GetMongoClient().DocExist(ctx, model.CollectionProject, 
filter)
 }
diff --git a/datasource/mongo/client/model/types.go 
b/datasource/mongo/client/model/types.go
index fc9d9a4..bcaa11a 100644
--- a/datasource/mongo/client/model/types.go
+++ b/datasource/mongo/client/model/types.go
@@ -31,6 +31,8 @@ const (
        CollectionInstance = "instance"
        CollectionDep      = "dependency"
        CollectionRole     = "role"
+       CollectionDomain   = "domain"
+       CollectionProject  = "project"
 )
 
 const (
@@ -125,3 +127,12 @@ type DelDepCacheKey struct {
        Key  *pb.MicroServiceKey
        Type string
 }
+
+type Domain struct {
+       Domain string `json:"domain,omitempty"`
+}
+
+type Project struct {
+       Domain  string `json:"domain,omitempty"`
+       Project string `json:"project,omitempty"`
+}
diff --git a/datasource/mongo/event/event.go b/datasource/mongo/event/event.go
index 528e8a2..13eeee2 100644
--- a/datasource/mongo/event/event.go
+++ b/datasource/mongo/event/event.go
@@ -22,8 +22,15 @@ import (
        "github.com/apache/servicecomb-service-center/pkg/log"
 )
 
+const (
+       increaseOne = 1
+       decreaseOne = -1
+)
+
 func init() {
        log.Info("event init")
        instanceEventHandler := NewInstanceEventHandler()
        
sd.EventProxy(instanceEventHandler.Type()).AddHandleFunc(instanceEventHandler.OnEvent)
+       sd.AddEventHandler(NewServiceEventHandler())
+       sd.AddEventHandler(NewSchemaSummaryEventHandler())
 }
diff --git a/datasource/mongo/event/instance_event_handler.go 
b/datasource/mongo/event/instance_event_handler.go
index 9dbe5bc..aaad685 100644
--- a/datasource/mongo/event/instance_event_handler.go
+++ b/datasource/mongo/event/instance_event_handler.go
@@ -35,6 +35,7 @@ import (
        "github.com/apache/servicecomb-service-center/pkg/log"
        simple "github.com/apache/servicecomb-service-center/pkg/time"
        "github.com/apache/servicecomb-service-center/pkg/util"
+       "github.com/apache/servicecomb-service-center/server/metrics"
        "github.com/apache/servicecomb-service-center/server/notify"
        "github.com/apache/servicecomb-service-center/server/syncernotify"
 )
@@ -59,6 +60,17 @@ func (h InstanceEventHandler) OnEvent(evt sd.MongoEvent) {
        if cacheService != nil {
                microService = cacheService.(model.Service).Service
        }
+       switch action {
+       case discovery.EVT_INIT:
+               metrics.ReportInstances(instance.Domain, increaseOne)
+               frameworkName, frameworkVersion := getFramework(microService)
+               metrics.ReportFramework(instance.Domain, instance.Project, 
frameworkName, frameworkVersion, increaseOne)
+       case discovery.EVT_CREATE:
+               metrics.ReportInstances(instance.Domain, increaseOne)
+       case discovery.EVT_DELETE:
+               metrics.ReportInstances(instance.Domain, decreaseOne)
+               // to report quota
+       }
        if microService == nil {
                log.Info("get cached service failed, then get from database")
                service, err := dao.GetService(context.Background(), 
bson.M{"serviceinfo.serviceid": providerID})
diff --git a/datasource/mongo/event/event.go 
b/datasource/mongo/event/schema_summary_event_handler.go
similarity index 55%
copy from datasource/mongo/event/event.go
copy to datasource/mongo/event/schema_summary_event_handler.go
index 528e8a2..e37bd81 100644
--- a/datasource/mongo/event/event.go
+++ b/datasource/mongo/event/schema_summary_event_handler.go
@@ -18,12 +18,32 @@
 package event
 
 import (
+       pb "github.com/go-chassis/cari/discovery"
+
+       
"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
        "github.com/apache/servicecomb-service-center/datasource/mongo/sd"
-       "github.com/apache/servicecomb-service-center/pkg/log"
+       "github.com/apache/servicecomb-service-center/server/metrics"
 )
 
-func init() {
-       log.Info("event init")
-       instanceEventHandler := NewInstanceEventHandler()
-       
sd.EventProxy(instanceEventHandler.Type()).AddHandleFunc(instanceEventHandler.OnEvent)
+type SchemaSummaryEventHandler struct {
+}
+
+func NewSchemaSummaryEventHandler() *SchemaSummaryEventHandler {
+       return &SchemaSummaryEventHandler{}
+}
+
+func (h *SchemaSummaryEventHandler) Type() string {
+       return model.ColumnSchema
+}
+
+func (h *SchemaSummaryEventHandler) OnEvent(evt sd.MongoEvent) {
+       schema := evt.Value.(model.Schema)
+       action := evt.Type
+       switch action {
+       case pb.EVT_INIT, pb.EVT_CREATE:
+               metrics.ReportSchemas(schema.Domain, increaseOne)
+       case pb.EVT_DELETE:
+               metrics.ReportSchemas(schema.Domain, decreaseOne)
+       default:
+       }
 }
diff --git a/datasource/mongo/event/service_event_handler.go 
b/datasource/mongo/event/service_event_handler.go
new file mode 100644
index 0000000..f9e2ca5
--- /dev/null
+++ b/datasource/mongo/event/service_event_handler.go
@@ -0,0 +1,107 @@
+/*
+ * 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 event
+
+import (
+       "context"
+       "fmt"
+       pb "github.com/go-chassis/cari/discovery"
+
+       
"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+       
"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+       "github.com/apache/servicecomb-service-center/datasource/mongo/sd"
+       "github.com/apache/servicecomb-service-center/datasource/mongo/util"
+       "github.com/apache/servicecomb-service-center/pkg/log"
+       "github.com/apache/servicecomb-service-center/server/metrics"
+)
+
+type ServiceEventHandler struct {
+}
+
+func NewServiceEventHandler() *ServiceEventHandler {
+       return &ServiceEventHandler{}
+}
+
+func (h *ServiceEventHandler) Type() string {
+       return model.ColumnService
+}
+func (h *ServiceEventHandler) OnEvent(evt sd.MongoEvent) {
+       ms := evt.Value.(model.Service)
+       fn, fv := getFramework(ms.Service)
+       switch evt.Type {
+       case pb.EVT_INIT, pb.EVT_CREATE:
+               ctx := context.Background()
+               err := newDomain(ctx, ms.Domain)
+               if err != nil {
+                       log.Error(fmt.Sprintf("new domain %s failed", 
ms.Domain), err)
+               }
+               err = newProject(ctx, ms.Domain, ms.Project)
+               if err != nil {
+                       log.Error(fmt.Sprintf("new project %s failed", 
ms.Project), err)
+               }
+               metrics.ReportServices(ms.Domain, fn, fv, increaseOne)
+       case pb.EVT_DELETE:
+               metrics.ReportServices(ms.Domain, fn, fv, decreaseOne)
+       default:
+       }
+       if evt.Type == pb.EVT_INIT {
+               return
+       }
+
+       log.Infof("caught [%s] service[%s][%s/%s/%s/%s] event",
+               evt.Type, ms.Service.ServiceId, ms.Service.Environment, 
ms.Service.AppId, ms.Service.ServiceName, ms.Service.Version)
+}
+
+func getFramework(ms *pb.MicroService) (string, string) {
+       if ms.Framework != nil && len(ms.Framework.Name) > 0 {
+               version := ms.Framework.Version
+               if len(ms.Framework.Version) == 0 {
+                       version = "UNKNOWN"
+               }
+               return ms.Framework.Name, version
+       }
+       return "UNKNOWN", "UNKNOWN"
+}
+
+func newDomain(ctx context.Context, domain string) error {
+       filter := util.NewFilter(util.Domain(domain))
+       exist, err := dao.ExistDomain(ctx, filter)
+       if exist {
+               log.Info(fmt.Sprintf("%s domain already exists", domain))
+       }
+       if err == nil {
+               err = dao.AddDomain(ctx, domain)
+       }
+       return err
+}
+
+func newProject(ctx context.Context, domain string, project string) error {
+       filter := util.NewDomainProjectFilter(domain, project)
+       exist, err := dao.ExistProject(ctx, filter)
+       if exist {
+               log.Info(fmt.Sprintf("%s domain and %s project already exists", 
domain, project))
+       }
+       if err == nil {
+               p := model.Project{
+                       Domain:  domain,
+                       Project: project,
+               }
+               err = dao.AddProject(ctx, p)
+       }
+       return err
+}
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index ac2f231..9850f4f 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -59,7 +59,6 @@ func (ds *DataSource) RegisterService(ctx context.Context, 
request *discovery.Cr
        project := util.ParseProject(ctx)
        serviceFlag := util.StringJoin([]string{
                service.Environment, service.AppId, service.ServiceName, 
service.Version}, "/")
-       //todo add quota check
        requestServiceID := service.ServiceId
 
        if len(requestServiceID) == 0 {
@@ -1903,6 +1902,11 @@ func registryInstance(ctx context.Context, request 
*discovery.RegisterInstanceRe
        project := util.ParseProject(ctx)
        remoteIP := util.GetIPFromContext(ctx)
        instance := request.Instance
+       ttl := int64(instance.HealthCheck.Interval * 
(instance.HealthCheck.Times + 1))
+
+       instanceFlag := fmt.Sprintf("ttl %ds, endpoints %v, host '%s', 
serviceID %s",
+               ttl, instance.Endpoints, instance.HostName, instance.ServiceId)
+
        instanceID := instance.InstanceId
        data := &model.Instance{
                Domain:      domain,
@@ -1911,9 +1915,6 @@ func registryInstance(ctx context.Context, request 
*discovery.RegisterInstanceRe
                Instance:    instance,
        }
 
-       instanceFlag := fmt.Sprintf("endpoints %v, host '%s', serviceID %s",
-               instance.Endpoints, instance.HostName, instance.ServiceId)
-
        insertRes, err := client.GetMongoClient().Insert(ctx, 
model.CollectionInstance, data)
        if err != nil {
                log.Error(fmt.Sprintf("register instance failed %s instanceID 
%s operator %s", instanceFlag, instanceID, remoteIP), err)
diff --git a/etc/conf/app.yaml b/etc/conf/app.yaml
index a3906bb..e53f3d7 100644
--- a/etc/conf/app.yaml
+++ b/etc/conf/app.yaml
@@ -173,6 +173,13 @@ tracing:
 
 quota:
   kind: buildin
+  cap:
+    service:
+      limit: 50000
+    instance:
+      limit: 150000
+    schema:
+      limit: 100
 
 
 syncer:
diff --git a/server/plugin/quota/quota.go b/server/plugin/quota/quota.go
index 51210d4..971e0ca 100644
--- a/server/plugin/quota/quota.go
+++ b/server/plugin/quota/quota.go
@@ -59,11 +59,11 @@ var (
 )
 
 func Init() {
-       DefaultServiceQuota = config.GetInt("quota.cap.service", 
defaultServiceLimit, config.WithStandby("QUOTA_SERVICE"))
-       DefaultInstanceQuota = config.GetInt("quota.cap.instance", 
defaultInstanceLimit, config.WithStandby("QUOTA_INSTANCE"))
-       DefaultSchemaQuota = config.GetInt("quota.cap.schema", 
defaultSchemaLimit, config.WithStandby("QUOTA_SCHEMA"))
-       DefaultTagQuota = config.GetInt("quota.cap.tag", defaultTagLimit, 
config.WithStandby("QUOTA_TAG"))
-       DefaultRuleQuota = config.GetInt("quota.cap.rule", defaultRuleLimit, 
config.WithStandby("QUOTA_RULE"))
+       DefaultServiceQuota = config.GetInt("quota.cap.service.limit", 
defaultServiceLimit, config.WithStandby("QUOTA_SERVICE"))
+       DefaultInstanceQuota = config.GetInt("quota.cap.instance.limit", 
defaultInstanceLimit, config.WithStandby("QUOTA_INSTANCE"))
+       DefaultSchemaQuota = config.GetInt("quota.cap.schema.limit", 
defaultSchemaLimit, config.WithStandby("QUOTA_SCHEMA"))
+       DefaultTagQuota = config.GetInt("quota.cap.tag.limit", defaultTagLimit, 
config.WithStandby("QUOTA_TAG"))
+       DefaultRuleQuota = config.GetInt("quota.cap.rule.limit", 
defaultRuleLimit, config.WithStandby("QUOTA_RULE"))
 }
 
 type ApplyQuotaResource struct {
diff --git a/server/service/instance.go b/server/service/instance.go
index f0f04fb..2d139eb 100644
--- a/server/service/instance.go
+++ b/server/service/instance.go
@@ -20,6 +20,8 @@ package service
 import (
        "context"
        "errors"
+       "fmt"
+       "github.com/apache/servicecomb-service-center/server/plugin/quota"
 
        "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/pkg/log"
@@ -32,8 +34,7 @@ import (
 type InstanceService struct {
 }
 
-func (s *InstanceService) Register(ctx context.Context,
-       in *pb.RegisterInstanceRequest) (*pb.RegisterInstanceResponse, error) {
+func (s *InstanceService) Register(ctx context.Context, in 
*pb.RegisterInstanceRequest) (*pb.RegisterInstanceResponse, error) {
        if err := Validate(in); err != nil {
                remoteIP := util.GetIPFromContext(ctx)
                log.Errorf(err, "register instance failed, invalid parameters, 
operator %s", remoteIP)
@@ -41,6 +42,22 @@ func (s *InstanceService) Register(ctx context.Context,
                        Response: pb.CreateResponse(pb.ErrInvalidParams, 
err.Error()),
                }, nil
        }
+       remoteIP := util.GetIPFromContext(ctx)
+       instanceFlag := fmt.Sprintf("endpoints %v, host '%s', serviceID %s",
+               in.Instance.Endpoints, in.Instance.HostName, 
in.Instance.ServiceId)
+       domainProject := util.ParseDomainProject(ctx)
+       quotaErr := checkInstanceQuota(ctx, domainProject, 
in.Instance.ServiceId)
+       if quotaErr != nil {
+               log.Error(fmt.Sprintf("register instance failed, %s, operator 
%s",
+                       instanceFlag, remoteIP), quotaErr)
+               response := &pb.RegisterInstanceResponse{
+                       Response: pb.CreateResponseWithSCErr(quotaErr),
+               }
+               if quotaErr.InternalError() {
+                       return response, quotaErr
+               }
+               return response, nil
+       }
 
        return datasource.Instance().RegisterInstance(ctx, in)
 }
@@ -207,3 +224,13 @@ func (s *InstanceService) ClusterHealth(ctx 
context.Context) (*pb.GetInstancesRe
                Instances: instResp.Instances,
        }, nil
 }
+
+func checkInstanceQuota(ctx context.Context, domainProject string, serviceID 
string) *pb.Error {
+       if !apt.IsSCInstance(ctx) {
+               res := quota.NewApplyQuotaResource(quota.TypeInstance,
+                       domainProject, serviceID, 1)
+               err := quota.Apply(ctx, res)
+               return err
+       }
+       return nil
+}
diff --git a/server/service/microservice.go b/server/service/microservice.go
index e6b34c2..46f8b12 100644
--- a/server/service/microservice.go
+++ b/server/service/microservice.go
@@ -18,16 +18,18 @@
 package service
 
 import (
+       "context"
        "fmt"
 
+       pb "github.com/go-chassis/cari/discovery"
+
        "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/pkg/gopool"
        "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/proto"
        "github.com/apache/servicecomb-service-center/pkg/util"
-       pb "github.com/go-chassis/cari/discovery"
-
-       "context"
+       "github.com/apache/servicecomb-service-center/server/core"
+       "github.com/apache/servicecomb-service-center/server/plugin/quota"
 )
 
 type MicroServiceService struct {
@@ -69,6 +71,7 @@ func (s *MicroServiceService) CreateServicePri(ctx 
context.Context, in *pb.Creat
        service := in.Service
        serviceFlag := util.StringJoin([]string{
                service.Environment, service.AppId, service.ServiceName, 
service.Version}, "/")
+       domainProject := util.ParseDomainProject(ctx)
 
        datasource.SetServiceDefaultValue(service)
        err := Validate(in)
@@ -79,6 +82,19 @@ func (s *MicroServiceService) CreateServicePri(ctx 
context.Context, in *pb.Creat
                        Response: pb.CreateResponse(pb.ErrInvalidParams, 
err.Error()),
                }, nil
        }
+       quotaErr := checkServiceQuota(ctx, domainProject)
+       if quotaErr != nil {
+               log.Error(fmt.Sprintf("create micro-service[%s] failed, 
operator: %s",
+                       serviceFlag, remoteIP), err)
+               resp := &pb.CreateServiceResponse{
+                       Response: pb.CreateResponseWithSCErr(quotaErr),
+               }
+               if quotaErr.InternalError() {
+                       return resp, quotaErr
+               }
+               return resp, nil
+       }
+
        return datasource.Instance().RegisterService(ctx, in)
 }
 
@@ -349,3 +365,13 @@ func (s *MicroServiceService) isCreateServiceEx(in 
*pb.CreateServiceRequest) boo
        }
        return true
 }
+
+func checkServiceQuota(ctx context.Context, domainProject string) *pb.Error {
+       if core.IsSCInstance(ctx) {
+               log.Debugf("skip quota check")
+               return nil
+       }
+       res := quota.NewApplyQuotaResource(quota.TypeService, domainProject, 
"", 1)
+       rst := quota.Apply(ctx, res)
+       return rst
+}

Reply via email to