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(); }
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); }
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")); }
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); } }
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); }
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()); }
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(); }
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); }
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); } }
public void ReturnsNullIfNoResources() { var balancer = new RandomLoadBalancer <Uri>(); balancer.GetResource().Should().BeNull(); }