in datasource/etcd/ms.go [483:549]
func (ds *MetadataManager) GetInstance(ctx context.Context, request *pb.GetOneInstanceRequest) (
*pb.GetOneInstanceResponse, error) {
domainProject := util.ParseDomainProject(ctx)
service := &pb.MicroService{}
var err error
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 in db, consumer[%s] find provider instance[%s/%s]",
request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId))
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 instance[%s/%s]",
request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId), err)
return nil, pb.NewError(pb.ErrInternal, err.Error())
}
}
provider, err := eutil.GetService(ctx, domainProject, request.ProviderServiceId)
if err != nil {
if errors.Is(err, datasource.ErrNoData) {
log.Debug(fmt.Sprintf("provider does not exist in db, consumer[%s] find provider instance[%s/%s]",
request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId))
return nil, pb.NewError(pb.ErrServiceNotExists,
fmt.Sprintf("Provider[%s] does not exist.", request.ProviderServiceId))
}
log.Error(fmt.Sprintf("get provider failed, consumer[%s] find provider instance[%s/%s]",
request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId), err)
return nil, pb.NewError(pb.ErrInternal, err.Error())
}
findFlag := func() string {
return fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find provider[%s][%s/%s/%s/%s] instance[%s]",
request.ConsumerServiceId, service.Environment, service.AppId, service.ServiceName, service.Version,
provider.ServiceId, provider.Environment, provider.AppId, provider.ServiceName, provider.Version,
request.ProviderInstanceId)
}
var item *cache.VersionRuleCacheItem
rev, _ := ctx.Value(util.CtxRequestRevision).(string)
item, err = cache.FindInstances.GetWithProviderID(ctx, service, pb.MicroServiceToKey(domainProject, provider),
&pb.HeartbeatSetElement{
ServiceId: request.ProviderServiceId, InstanceId: request.ProviderInstanceId,
}, request.Tags, rev)
if err != nil {
log.Error(fmt.Sprintf("find Instances by providerID failed, %s failed", findFlag()), err)
return nil, pb.NewError(pb.ErrInternal, err.Error())
}
if item == nil || len(item.Instances) == 0 {
mes := fmt.Errorf("%s failed, provider instance does not exist", findFlag())
log.Error("find Instances by ProviderID failed", mes)
return nil, pb.NewError(pb.ErrInstanceNotExists, mes.Error())
}
instance := item.Instances[0]
if rev == item.Rev {
instance = nil // for gRPC
}
_ = util.WithResponseRev(ctx, item.Rev)
return &pb.GetOneInstanceResponse{
Instance: instance,
}, nil
}