Example #1
0
        public virtual async Task <Uri> ResolveServiceInstanceAsync(Uri request)
        {
            _logger?.LogTrace("ResolveServiceInstance {serviceInstance}", request.Host);
            var availableServiceInstances = await _serviceInstanceProvider.GetSkynetCloudInstancesWithCacheAsync(request.Host, _distributedCache).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);
            }
        }