コード例 #1
0
        static async Task Main(string[] args)
        {
            ILoadBalancer balancer = new RoundRobinLoadBalancer(new PollingConsulServiceProvider());
            var           client   = new HttpClient();

            Console.WriteLine("Request by RoundRobinLoadBalancer....");
            for (int i = 0; i < 10; i++)
            {
                var service = await balancer.GetServiceAsync();

                Console.WriteLine(DateTime.Now.ToString() + "-RoundRobin:" +
                                  await client.GetStringAsync("http://" + service + "/api/values") + " --> " + "Request from " + service);
            }

            Console.WriteLine("Request by RandomLoadBalancer....");
            balancer = new RandomLoadBalancer(new PollingConsulServiceProvider());
            for (int i = 0; i < 10; i++)
            {
                var service = await balancer.GetServiceAsync();

                Console.WriteLine(DateTime.Now.ToString() + "-Random:" +
                                  await client.GetStringAsync("http://" + service + "/api/values") + " --> " + "Request from " + service);
            }

            Console.ReadKey();
        }
コード例 #2
0
        public async Task Endpoint_ZeroEndpoints_ReturnsNull()
        {
            var subscriber = Substitute.For <IServiceSubscriber>();

            subscriber.Endpoints().Returns(Task.FromResult(new List <Endpoint>()));
            var lb = new RandomLoadBalancer(subscriber);

            var actual = await lb.Endpoint();

            Assert.Null(actual);
        }
コード例 #3
0
        public void WillReplaceHostNameWhenConfigured()
        {
            var balancer = new RandomLoadBalancer <Uri>();

            balancer.Resources.Add(new Uri("https://127.0.0.1"));
            var bindingMap = new BindingMap {
                { "test", balancer }
            };

            var startUri = new Uri("http://test/resource");

            bindingMap.TryRebindUri(startUri, out var newUri).Should().BeTrue();
            newUri.Should().BeEquivalentTo(new Uri("https://127.0.0.1/resource"));
        }
コード例 #4
0
        public void ReturnsOnlyItemIfThatIsAllThereIs()
        {
            var balancer = new RandomLoadBalancer <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);
            }
        }
コード例 #5
0
        public List <People> GetAll(string token)
        {
            var loadBalancer = new RandomLoadBalancer(discoveryClient);
            var handler      = new LoadBalancerHttpClientHandler(loadBalancer);

            var httpClient = new HttpClient(handler);

            httpClient.SetBearerToken(token);

            var response = httpClient.GetAsync("http://supplier/api/v1/people").Result;

            var result = response.Content.ReadAsAsync <List <People> >().Result;

            httpClient.Dispose();
            return(result);
        }
コード例 #6
0
        public void Random()
        {
            var memberIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };
            var lb        = new RandomLoadBalancer();

            Assert.That(lb.Count, Is.EqualTo(0));
            Assert.Throws <InvalidOperationException>(() => lb.GetMember());

            lb.NotifyMembers(memberIds);
            Assert.That(lb.Count, Is.EqualTo(3));

            var seen          = Guid.Empty;
            var seenDifferent = false;

            for (var i = 0; i < 10; i++)
            {
                var memberId = lb.GetMember();
                Assert.That(memberIds, Does.Contain(memberId));

                if (seen == Guid.Empty)
                {
                    seen = memberId;
                }
                else if (seen != memberId)
                {
                    seenDifferent = true;
                }
            }

            Assert.That(seenDifferent, Is.True);

            memberIds = new[] { Guid.NewGuid(), Guid.NewGuid() };

            lb.NotifyMembers(memberIds);
            Assert.That(lb.Count, Is.EqualTo(2));

            for (var i = 0; i < 10; i++)
            {
                var memberId = lb.GetMember();
                Assert.That(memberIds, Does.Contain(memberId));
            }

            lb.NotifyMembers(new Guid[0]);
            Assert.That(lb.Count, Is.EqualTo(0));
            Assert.Throws <InvalidOperationException>(() => lb.GetMember());
        }
コード例 #7
0
        static Program()
        {
            // Create the container as usual.
            container = new Container();
            container.Options.DefaultScopedLifestyle = new ThreadScopedLifestyle();
            var rpcServer = new ServiceRegistryAddress()
            {
                Host = "127.0.0.1", Port = 8500
            };
            //var userServiceClient = new RpcHttpClient("UserService", rpcServer, RandomLoadBalancer.GetInstance());
            var userServiceClient = new RpcTcpClient("UserService", rpcServer, RandomLoadBalancer.GetInstance());

            container.Register <IUserService>(() => userServiceClient.UseService <IUserService>(), Lifestyle.Scoped);

            // Optionally verify the container.
            container.Verify();
        }
コード例 #8
0
        public void ReturnsRandomEntryWhenMultipleExist()
        {
            var balancer = new RandomLoadBalancer <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"));

            var list1 = new List <Uri>();
            var list2 = new List <Uri>();

            foreach (var _ in Enumerable.Range(1, 100))
            {
                list1.Add(balancer.GetResource());
                list2.Add(balancer.GetResource());
            }

            var numSame = list1.Select((t, i) => t.ToString() == list2[i].ToString() ? 1 : 0).Sum();

            numSame.Should().BeLessThan(list1.Count);
        }
コード例 #9
0
        public async Task Endpoint_MultipleEndpoints_ReturnsEndpointInRandomOrder()
        {
            var expectedList = new List <Endpoint>
            {
                new Endpoint {
                    Host = Guid.NewGuid().ToString(), Port = 1
                },
                new Endpoint {
                    Host = Guid.NewGuid().ToString(), Port = 2
                },
                new Endpoint {
                    Host = Guid.NewGuid().ToString(), Port = 3
                }
            };

            var subscriber = Substitute.For <IServiceSubscriber>();

            subscriber.Endpoints().Returns(Task.FromResult(expectedList));
            var lb = new RandomLoadBalancer(subscriber, 0);


            var actual = new List <Endpoint>();

            for (var i = 0; i < 10; i++)
            {
                actual.Add(await lb.Endpoint());
            }

            var expectedOrder = new List <int> {
                2, 2, 2, 1, 0, 1, 2, 1, 2, 0
            };

            for (var i = 0; i < actual.Count; i++)
            {
                Assert.Equal(expectedList[expectedOrder[i]].Host, actual[i].Host);
                Assert.Equal(expectedList[expectedOrder[i]].Port, actual[i].Port);
            }
        }
コード例 #10
0
        public void ReturnsNullIfNoResources()
        {
            var balancer = new RandomLoadBalancer <Uri>();

            balancer.GetResource().Should().BeNull();
        }