diff --git a/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerFactory.cs b/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerFactory.cs index 72ccdba1..e7b323a4 100644 --- a/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerFactory.cs +++ b/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerFactory.cs @@ -19,7 +19,7 @@ namespace Ocelot.LoadBalancer.LoadBalancers switch (reRoute.LoadBalancer) { case "RoundRobin": - return new RoundRobinLoadBalancer(await serviceProvider.Get()); + return new RoundRobinLoadBalancer(async () => await serviceProvider.Get()); case "LeastConnection": return new LeastConnectionLoadBalancer(async () => await serviceProvider.Get(), reRoute.ServiceProviderConfiguraion.ServiceName); default: diff --git a/src/Ocelot/LoadBalancer/LoadBalancers/RoundRobinLoadBalancer.cs b/src/Ocelot/LoadBalancer/LoadBalancers/RoundRobinLoadBalancer.cs index 37efe22f..4bc78915 100644 --- a/src/Ocelot/LoadBalancer/LoadBalancers/RoundRobinLoadBalancer.cs +++ b/src/Ocelot/LoadBalancer/LoadBalancers/RoundRobinLoadBalancer.cs @@ -2,27 +2,31 @@ using System.Threading.Tasks; using Ocelot.Responses; using Ocelot.Values; +using System; namespace Ocelot.LoadBalancer.LoadBalancers { public class RoundRobinLoadBalancer : ILoadBalancer { - private readonly List _services; + private readonly Func>> _services; + private int _last; - public RoundRobinLoadBalancer(List services) + public RoundRobinLoadBalancer(Func>> services) { _services = services; } + public async Task> Lease() { - if (_last >= _services.Count) + var services = await _services.Invoke(); + if (_last >= services.Count) { _last = 0; } - var next = await Task.FromResult(_services[_last]); + var next = await Task.FromResult(services[_last]); _last++; return new OkResponse(next.HostAndPort); } diff --git a/test/Ocelot.UnitTests/LoadBalancer/RoundRobinTests.cs b/test/Ocelot.UnitTests/LoadBalancer/RoundRobinTests.cs index f2ef5367..0820b8be 100644 --- a/test/Ocelot.UnitTests/LoadBalancer/RoundRobinTests.cs +++ b/test/Ocelot.UnitTests/LoadBalancer/RoundRobinTests.cs @@ -6,6 +6,7 @@ using Ocelot.Values; using Shouldly; using TestStack.BDDfy; using Xunit; +using System.Threading.Tasks; namespace Ocelot.UnitTests.LoadBalancer { @@ -24,7 +25,7 @@ namespace Ocelot.UnitTests.LoadBalancer new Service("product", new HostAndPort("127.0.0.1", 5001), string.Empty, string.Empty, new string[0]) }; - _roundRobin = new RoundRobinLoadBalancer(_services); + _roundRobin = new RoundRobinLoadBalancer(() => Task.FromResult(_services)); } [Fact]