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); }
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); }
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()); }
public virtual Address Next() { IMember member = _loadBalancer.Next(); return(member == null ? null : member.GetAddress()); }