in datasource/etcd/ms.go [642:707]
func (ds *MetadataManager) findInstance(ctx context.Context, request *pb.FindInstancesRequest,
provider *pb.MicroServiceKey, rev string) (*pb.FindInstancesResponse, error) {
var err error
domainProject := util.ParseDomainProject(ctx)
service := &pb.MicroService{Environment: request.Environment}
if len(request.ConsumerServiceId) > 0 {
service, err = eutil.GetService(ctx, domainProject, request.ConsumerServiceId)
if err != nil {
if errors.Is(err, datasource.ErrNoData) {
log.Debug(fmt.Sprintf("consumer does not exist, consumer[%s] find provider[%s/%s/%s]",
request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName))
return nil, pb.NewError(pb.ErrServiceNotExists,
fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId))
}
log.Error(fmt.Sprintf("get consumer failed, consumer[%s] find provider[%s/%s/%s]",
request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName), err)
return nil, pb.NewError(pb.ErrInternal, err.Error())
}
provider.Environment = service.Environment
}
// provider is not a shared micro-service,
// only allow shared micro-service instances found request different domains.
ctx = util.SetTargetDomainProject(ctx, util.ParseDomain(ctx), util.ParseProject(ctx))
provider.Tenant = util.ParseTargetDomainProject(ctx)
findFlag := fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find provider[%s/%s/%s]",
request.ConsumerServiceId, service.Environment, service.AppId, service.ServiceName, service.Version,
provider.Environment, provider.AppId, provider.ServiceName)
// cache
var item *cache.VersionRuleCacheItem
item, err = cache.FindInstances.Get(ctx, service, provider, request.Tags, rev)
if err != nil {
log.Error(fmt.Sprintf("FindInstancesCache.Get failed, %s failed", findFlag), err)
return nil, pb.NewError(pb.ErrInternal, err.Error())
}
if item == nil {
err := fmt.Errorf("%s failed, provider does not exist", findFlag)
log.Error("FindInstancesCache.Get failed", err)
return nil, pb.NewError(pb.ErrServiceNotExists, err.Error())
}
// add dependency queue
if len(request.ConsumerServiceId) > 0 &&
len(item.ServiceIds) > 0 &&
!cache.DependencyRule.ExistRule(ctx, request.ConsumerServiceId, provider) {
provider, err = ds.reshapeProviderKey(ctx, provider, item.ServiceIds[0])
if err != nil {
return nil, err
}
if provider != nil {
err = eutil.AddServiceVersionRule(ctx, domainProject, service, provider)
} else {
err := fmt.Errorf("%s failed, provider does not exist", findFlag)
log.Error("AddServiceVersionRule failed", err)
return nil, pb.NewError(pb.ErrServiceNotExists, err.Error())
}
if err != nil {
log.Error(fmt.Sprintf("AddServiceVersionRule failed, %s failed", findFlag), err)
return nil, pb.NewError(pb.ErrInternal, err.Error())
}
}
return ds.genFindResult(ctx, rev, item)
}