Пример #1
0
        public async Task InvokeAsync(HttpContext context, IanvsContext ianvsContext,
                                      IIanvsConfigurationStore ianvsConfiguration, LoadBalancerFactory loadBalancerFactory)
        {
            // TODO: Implement Load Balancing
            // WIP - https://github.com/onyx-ws/ianvs/issues/5

            // Support for different load balancing modes - Random/Round Robin/etc.
            _logger.LogInformation($"{Environment.MachineName} {ianvsContext.RequestId} finding load balancer");
            string loadBalancerMode = ianvsContext.MatchedOperation.LoadBalancerMethod;

            if (string.IsNullOrWhiteSpace(loadBalancerMode))
            {
                loadBalancerMode = ianvsContext.MatchedEndpoint.LoadBalancerMethod;
            }
            if (string.IsNullOrWhiteSpace(loadBalancerMode))
            {
                loadBalancerMode = ianvsConfiguration.LoadBalancerMethod;
            }

            ILoadBalancer loadBalancer = loadBalancerFactory.GetLoadBalancer(loadBalancerMode);

            _logger.LogInformation($"{Environment.MachineName} {ianvsContext.RequestId} {loadBalancerMode} load balancer found");

            // Operation level servers take priority
            if (!(ianvsContext.MatchedOperation.Servers?.Count == 0))
            {
                _logger.LogInformation($"{Environment.MachineName} {ianvsContext.RequestId} Selecting server out of {ianvsContext.MatchedOperation.Servers.Count} server(s)");
                ianvsContext.TargetServer = await loadBalancer.Next(ianvsContext.MatchedOperation.Servers);

                _logger.LogInformation($"{Environment.MachineName} {ianvsContext.RequestId} Server {ianvsContext.TargetServer.Url} selected");
            }
            // If not operation level servers then use Endpoint level servers
            else if (!(ianvsContext.MatchedEndpoint.Servers?.Count == 0))
            {
                _logger.LogInformation($"{Environment.MachineName} {ianvsContext.RequestId} Selecting server out of {ianvsContext.MatchedEndpoint.Servers.Count} server(s)");
                ianvsContext.TargetServer = await loadBalancer.Next(ianvsContext.MatchedEndpoint.Servers);

                _logger.LogInformation($"{Environment.MachineName} {ianvsContext.RequestId} Server {ianvsContext.TargetServer.Url} selected");
            }
            // Else use global servers defined
            else
            {
                _logger.LogInformation($"{Environment.MachineName} {ianvsContext.RequestId} Selecting server out of {ianvsConfiguration.Servers.Count} server(s)");
                ianvsContext.TargetServer = await loadBalancer.Next(ianvsConfiguration.Servers);

                _logger.LogInformation($"{Environment.MachineName} {ianvsContext.RequestId} Server {ianvsContext.TargetServer.Url} selected");
            }

            ianvsContext.TargetUrl = ianvsContext.TargetServer.Url + (ianvsContext.MatchedEndpoint.Url == "/" ? "" : ianvsContext.MatchedEndpoint.Url);

            await _next(context);
        }
Пример #2
0
        private Uri GetRedirectUri(HttpListenerRequest request)
        {
            var redirectUriBuilder = new UriBuilder(request.Url);
            var redirectUri        = loadBalancer.Next();

            if (redirectUri == null)
            {
                return(null);
            }

            redirectUriBuilder.Port = redirectUri.Port;
            redirectUriBuilder.Host = redirectUri.Host;

            return(redirectUriBuilder.Uri);
        }
Пример #3
0
 public Connection GetRandomConnection()
 {
     if (IsSmartRoutingEnabled)
     {
         var member = _loadBalancer.Next();
         if (member != null)
         {
             var connection = GetConnection(member.Uuid);
             if (connection != null)
             {
                 return(connection);
             }
         }
     }
     return(_connections.Values.SingleOrDefault());
 }
Пример #4
0
        public virtual Address Next()
        {
            IMember member = _loadBalancer.Next();

            return(member == null ? null : member.GetAddress());
        }