Example #1
0
        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));
        }
Example #2
0
        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);
            }
        }