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
+}