public void CanUseBaseRoute() { var balancer = new RoundRobinBalancer <Uri>(); balancer.Resources.Add(new Uri("https://127.0.0.1/api/round-robin")); balancer.Resources.Add(new Uri("http://[::1]/round-robin")); balancer.Resources.Add(new Uri("https://www.google.com/api/foo/bar/baz")); var bindingMap = new BindingMap { { "round-robin", balancer } }; var startUri = new Uri("http://round-robin/more-complex/query?foo=bar&baz=1"); bindingMap.TryRebindUri(startUri, out var newUri).Should().BeTrue(); newUri.Should() .BeEquivalentTo(new Uri("https://127.0.0.1/api/round-robin/more-complex/query?foo=bar&baz=1")); bindingMap.TryRebindUri(startUri, out newUri).Should().BeTrue(); newUri.Should().BeEquivalentTo(new Uri("http://[::1]/round-robin/more-complex/query?foo=bar&baz=1")); bindingMap.TryRebindUri(startUri, out newUri).Should().BeTrue(); newUri.Should() .BeEquivalentTo(new Uri("https://www.google.com/api/foo/bar/baz/more-complex/query?foo=bar&baz=1")); bindingMap.TryRebindUri(startUri, out newUri).Should().BeTrue(); newUri.Should() .BeEquivalentTo(new Uri("https://127.0.0.1/api/round-robin/more-complex/query?foo=bar&baz=1")); }
public static void RunSnippet() { List <Node> servers = new List <Node>(); servers.Add(new Node("serv", "urlA", 1)); servers.Add(new Node("serv", "urlB", 1)); servers.Add(new Node("serv", "urlC", 4)); Dictionary <string, List <int> > dictLog = new Dictionary <string, List <int> >(); RoundRobinBalancer balancer = new RoundRobinBalancer(servers); for (int i = 1; i <= 100; i++) { Node node = balancer.DispatchTo(); if (!dictLog.ContainsKey(node.Url)) { dictLog[node.Url] = new List <int>(); } dictLog[node.Url].Add(i); } foreach (string key in dictLog.Keys) { WL("Url:{0} ==> {1}", key, dictLog[key].Count); } }
public void RoundRobin() { var instances = new List <IServiceInstance> { new ServiceInstance("test", 80) { Weight = 1 }, new ServiceInstance("test", 81) { Weight = 2 }, new ServiceInstance("test", 82) { Weight = 3 }, }; var record = new InstanceCacheRecord(); foreach (var ins in instances) { record.InstanceMap.TryAdd(Guid.NewGuid(), ins); } var balancer = new RoundRobinBalancer(null, record); var ports = Enumerable.Range(0, 300).Select(_ => balancer.Pick().Instance.Port); { var x80 = ports.Count(p => p == 80); var x81 = ports.Count(p => p == 81); var x82 = ports.Count(p => p == 82); Assert.Equal(50, x80); Assert.Equal(100, x81); Assert.Equal(150, x82); } { var x80 = ports.Take(6).Count(p => p == 80); var x81 = ports.Take(6).Count(p => p == 81); var x82 = ports.Take(6).Count(p => p == 82); Assert.Equal(1, x80); Assert.Equal(2, x81); Assert.Equal(3, x82); } { var x80 = ports.Skip(60).Take(60).Count(p => p == 80); var x81 = ports.Skip(60).Take(60).Count(p => p == 81); var x82 = ports.Skip(60).Take(60).Count(p => p == 82); Assert.Equal(10, x80); Assert.Equal(20, x81); Assert.Equal(30, x82); } }
public void ReturnsItemsInOrderWrappingAroundToFirst() { var balancer = new RoundRobinBalancer <Uri>(); balancer.Resources.Add(new Uri("http://one.test")); balancer.Resources.Add(new Uri("http://two.test")); balancer.Resources.Add(new Uri("http://three.test")); balancer.GetResource().Should().Be(new Uri("http://one.test")); balancer.GetResource().Should().Be(new Uri("http://two.test")); balancer.GetResource().Should().Be(new Uri("http://three.test")); balancer.GetResource().Should().Be(new Uri("http://one.test")); balancer.GetResource().Should().Be(new Uri("http://two.test")); balancer.GetResource().Should().Be(new Uri("http://three.test")); }
public void OnlyItemReturnedEveryTime() { var balancer = new RoundRobinBalancer <Uri>(); balancer.Resources.Add(new Uri("http://test.local")); var sameAsFirst = balancer.GetResource(); sameAsFirst.Should().NotBeNull(); foreach (var _ in Enumerable.Range(1, 100)) { balancer.GetResource().Should().Be(sameAsFirst); } }
public void WillUseLoadBalancerRulesAndRespectQueries() { var balancer = new RoundRobinBalancer <Uri>(); balancer.Resources.Add(new Uri("https://127.0.0.1")); balancer.Resources.Add(new Uri("http://[::1]")); balancer.Resources.Add(new Uri("https://www.google.com")); var bindingMap = new BindingMap { { "round-robin", balancer } }; var startUri = new Uri("http://round-robin/more-complex/query?foo=bar&baz=1"); bindingMap.TryRebindUri(startUri, out var newUri).Should().BeTrue(); newUri.Should().BeEquivalentTo(new Uri("https://127.0.0.1/more-complex/query?foo=bar&baz=1")); bindingMap.TryRebindUri(startUri, out newUri).Should().BeTrue(); newUri.Should().BeEquivalentTo(new Uri("http://[::1]/more-complex/query?foo=bar&baz=1")); bindingMap.TryRebindUri(startUri, out newUri).Should().BeTrue(); newUri.Should().BeEquivalentTo(new Uri("https://www.google.com/more-complex/query?foo=bar&baz=1")); bindingMap.TryRebindUri(startUri, out newUri).Should().BeTrue(); newUri.Should().BeEquivalentTo(new Uri("https://127.0.0.1/more-complex/query?foo=bar&baz=1")); }
public void NothingReturnedWhenNoEntries() { var balancer = new RoundRobinBalancer <Uri>(); balancer.GetResource().Should().BeNull(); }