Пример #1
0
        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"));
        }
Пример #2
0
    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);
        }
    }
Пример #3
0
        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);
            }
        }
Пример #6
0
        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();
        }