in datasource/mongo/ms.go [63:128]
func (ds *MetadataManager) RegisterService(ctx context.Context, request *discovery.CreateServiceRequest) (*discovery.CreateServiceResponse, error) {
service := request.Service
remoteIP := util.GetIPFromContext(ctx)
domain := util.ParseDomain(ctx)
project := util.ParseProject(ctx)
serviceFlag := util.StringJoin([]string{
service.Environment, service.AppId, service.ServiceName, service.Version}, "/")
requestServiceID := service.ServiceId
if len(requestServiceID) == 0 {
ctx = util.SetContext(ctx, uuid.ContextKey, util.StringJoin([]string{domain, project, service.Environment, service.AppId, service.ServiceName, service.Alias, service.Version}, "/"))
service.ServiceId = uuid.Generator().GetServiceID(ctx)
}
// the service unique index in table is (serviceId/serviceEnv,serviceAppid,servicename,serviceVersion)
if len(service.Alias) != 0 {
serviceID, err := GetServiceID(ctx, &discovery.MicroServiceKey{
Environment: service.Environment,
AppId: service.AppId,
ServiceName: service.ServiceName,
Version: service.Version,
Alias: service.Alias,
})
if err != nil && !errors.Is(err, datasource.ErrNoData) {
return nil, discovery.NewError(discovery.ErrUnavailableBackend, err.Error())
}
if len(serviceID) != 0 {
if len(requestServiceID) != 0 && requestServiceID != serviceID {
log.Warn(fmt.Sprintf("create micro-service[%s] failed, service already exists, operator: %s",
serviceFlag, remoteIP))
return nil, discovery.NewError(discovery.ErrServiceAlreadyExists,
"ServiceID conflict or found the same service with different id.")
}
return &discovery.CreateServiceResponse{
ServiceId: serviceID,
}, nil
}
}
err := createServiceTxn(ctx, request, domain, project, service)
if err != nil {
if dao.IsDuplicateKey(err) {
serviceIDInner, err := GetServiceID(ctx, &discovery.MicroServiceKey{
Environment: service.Environment,
AppId: service.AppId,
ServiceName: service.ServiceName,
Version: service.Version,
})
if err != nil && !errors.Is(err, datasource.ErrNoData) {
return nil, discovery.NewError(discovery.ErrUnavailableBackend, err.Error())
}
// serviceid conflict with the service in the database
if len(requestServiceID) != 0 && serviceIDInner != requestServiceID {
return nil, discovery.NewError(discovery.ErrServiceAlreadyExists,
"ServiceID conflict or found the same service with different id.")
}
return &discovery.CreateServiceResponse{
ServiceId: serviceIDInner,
}, nil
}
log.Error(fmt.Sprintf("create micro-service[%s] failed, service already exists, operator: %s",
serviceFlag, remoteIP), err)
return nil, discovery.NewError(discovery.ErrInternal, err.Error())
}
return &discovery.CreateServiceResponse{
ServiceId: service.ServiceId,
}, nil
}