public virtual async Task <Uri> ResolveServiceInstanceAsync(Uri request) { var serviceName = request.Host; _logger?.LogTrace("ResolveServiceInstance {serviceName}", serviceName); string cacheKey = IndexKeyPrefix + serviceName; // get instances for this service var availableServiceInstances = await ServiceInstanceProvider.GetInstancesWithCacheAsync(serviceName, _distributedCache); if (!availableServiceInstances.Any()) { _logger?.LogError("No service instances available for {serviceName}", serviceName); return(request); } // get next instance, or wrap back to first instance if we reach the end of the list IServiceInstance serviceInstance = null; var nextInstanceIndex = await GetOrInitNextIndex(cacheKey, 0); if (nextInstanceIndex >= availableServiceInstances.Count) { nextInstanceIndex = 0; } serviceInstance = availableServiceInstances[nextInstanceIndex]; await SetNextIndex(cacheKey, nextInstanceIndex); return(new Uri(serviceInstance.Uri, request.PathAndQuery)); }
public virtual async Task <Uri> ResolveServiceInstanceAsync(Uri request) { _logger?.LogTrace("ResolveServiceInstance {serviceInstance}", request.Host); var availableServiceInstances = await _serviceInstanceProvider.GetInstancesWithCacheAsync(request.Host, _distributedCache); if (availableServiceInstances.Count > 0) { var resolvedUri = availableServiceInstances[_random.Next(availableServiceInstances.Count)].Uri; _logger?.LogDebug("Resolved {url} to {service}", request.Host, resolvedUri.Host); return(new Uri(resolvedUri, request.PathAndQuery)); } else { _logger?.LogWarning("Attempted to resolve service for {url} but found 0 instances", request.Host); return(request); } }
public virtual async Task <Uri> ResolveServiceInstanceAsync(Uri request) { _logger?.LogTrace("ResolveServiceInstance {serviceInstance}", request.Host); var availableServiceInstances = await _serviceInstanceProvider.GetInstancesWithCacheAsync(request.Host, _distributedCache, _cacheOptions).ConfigureAwait(false); if (availableServiceInstances.Count > 0) { // load balancer instance selection predictability is not likely to be a security concern var resolvedUri = availableServiceInstances[_random.Next(availableServiceInstances.Count)].Uri; _logger?.LogDebug("Resolved {url} to {service}", request.Host, resolvedUri.Host); return(new Uri(resolvedUri, request.PathAndQuery)); } else { _logger?.LogWarning("Attempted to resolve service for {url} but found 0 instances", request.Host); return(request); } }