public async Task Endpoint_MultipleEndpoints_ReturnsEndpointInOrder() { var expectedList = new List <RegistryInformation> { new RegistryInformation { Address = Guid.NewGuid().ToString(), Port = 1 }, new RegistryInformation { Address = Guid.NewGuid().ToString(), Port = 2 }, new RegistryInformation { Address = Guid.NewGuid().ToString(), Port = 3 } }; var subscriber = Substitute.For <IServiceSubscriber>(); subscriber.Endpoints().Returns(Task.FromResult(expectedList)); var lb = new RoundRobinLoadBalancer(subscriber); foreach (var expected in expectedList) { var actual = await lb.Endpoint(); Assert.Equal(expected.Address, actual.Address); Assert.Equal(expected.Port, actual.Port); } var actualReset = await lb.Endpoint(); Assert.Equal(expectedList[0].Address, actualReset.Address); Assert.Equal(expectedList[0].Port, actualReset.Port); }
public async Task Endpoint_ResetsNumberOfEndpoints_ReturnsEndpointAndResets() { 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 RoundRobinLoadBalancer(subscriber); foreach (var expected in expectedList.Take(2)) { var actual = await lb.Endpoint(); Assert.Equal(expected.Host, actual.Host); Assert.Equal(expected.Port, actual.Port); } subscriber.Endpoints().Returns(Task.FromResult(expectedList.Take(2).ToList())); var actualReset = await lb.Endpoint(); Assert.Equal(expectedList[0].Host, actualReset.Host); Assert.Equal(expectedList[0].Port, actualReset.Port); }
public async Task Endpoint_OneEndpoint_ReturnsEndpoint() { var endpoint = new Endpoint { Host = Guid.NewGuid().ToString(), Port = 123 }; var subscriber = Substitute.For <IServiceSubscriber>(); subscriber.Endpoints().Returns(Task.FromResult(new List <Endpoint> { endpoint })); var lb = new RoundRobinLoadBalancer(subscriber); var actual = new List <Endpoint> { await lb.Endpoint(), await lb.Endpoint() }; foreach (var endpointActual in actual) { Assert.Equal(endpoint.Host, endpointActual.Host); Assert.Equal(endpoint.Port, endpointActual.Port); } }
public IActionResult About() { var serviceSubscriber = subscriberFactory.CreateSubscriber("NanoFabric_Ocelot", ConsulSubscriberOptions.Default, new NanoFabric.Router.Throttle.ThrottleSubscriberOptions() { MaxUpdatesPeriod = TimeSpan.FromSeconds(30), MaxUpdatesPerPeriod = 20 }); serviceSubscriber.StartSubscription().ConfigureAwait(false).GetAwaiter().GetResult(); serviceSubscriber.EndpointsChanged += async(sender, eventArgs) => { // Reset connection pool, do something with this info, etc var endpoints = await serviceSubscriber.Endpoints(); var servicesInfo = string.Join(",", endpoints); }; ILoadBalancer loadBalancer = new RoundRobinLoadBalancer(serviceSubscriber); var endPoint = loadBalancer.Endpoint().ConfigureAwait(false).GetAwaiter().GetResult(); string content = "Your application description page"; if (endPoint != null) { content = httpClient.GetStringAsync($"{endPoint.ToUri()}api/values").Result; ViewData["Message"] = $"Get {endPoint.ToUri()}api/values: {content}."; } else { ViewData["Message"] = $"{content}."; } return(View()); }
static void Main(string[] args) { Initialize(); IServiceSubscriberFactory subscriberFactory = _serviceProvider.GetRequiredService <IServiceSubscriberFactory>(); // 创建ConsoleLogProvider并根据日志类目名称(CategoryName)生成Logger实例 var logger = _serviceProvider.GetService <ILoggerFactory>().AddConsole().CreateLogger("App"); var serviceSubscriber = subscriberFactory.CreateSubscriber("SampleService.Kestrel", ConsulSubscriberOptions.Default, new NanoFabric.Router.Throttle.ThrottleSubscriberOptions() { MaxUpdatesPeriod = TimeSpan.FromSeconds(30), MaxUpdatesPerPeriod = 20 }); serviceSubscriber.StartSubscription().ConfigureAwait(false).GetAwaiter().GetResult(); serviceSubscriber.EndpointsChanged += async(sender, eventArgs) => { // Reset connection pool, do something with this info, etc var endpoints = await serviceSubscriber.Endpoints(); var servicesInfo = string.Join(",", endpoints); logger.LogInformation($"Received updated subscribers [{servicesInfo}]"); }; ILoadBalancer loadBalancer = new RoundRobinLoadBalancer(serviceSubscriber); var endPoint = loadBalancer.Endpoint().ConfigureAwait(false).GetAwaiter().GetResult(); var httpClient = new HttpClient(); var traceid = Guid.NewGuid().ToString(); httpClient.DefaultRequestHeaders.Add("ot-traceid", traceid); var content = httpClient.GetStringAsync($"{endPoint.ToUri()}api/values").Result; Console.WriteLine($"{traceid} content: {content }"); System.Console.ReadLine(); }
public async Task Endpoint_ZeroEndpoints_ReturnsNull() { var subscriber = Substitute.For <IServiceSubscriber>(); subscriber.Endpoints().Returns(Task.FromResult(new List <Endpoint>())); var lb = new RoundRobinLoadBalancer(subscriber); var actual = await lb.Endpoint(); Assert.Null(actual); }
public async Task <IActionResult> CallApi() { var authority = configuration.GetValue <string>("Authority"); var discoClient = new HttpClient(); var disco = await discoClient.GetDiscoveryDocumentAsync(new DiscoveryDocumentRequest { Address = authority, Policy = new DiscoveryPolicy() { RequireHttps = false } }); if (disco.IsError) { throw new ApplicationException($"Status code: {disco.IsError}, Error: {disco.Error}"); } var tokenClient = new HttpClient(); var tokenResponse = await tokenClient.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest() { Address = disco.TokenEndpoint, ClientId = "mvc.hybrid", ClientSecret = "secret", Scope = "api1" }); if (tokenResponse.IsError) { throw new ApplicationException($"Status code: {tokenResponse.IsError}, Error: {tokenResponse.Error}"); } var serviceSubscriber = subscriberFactory.CreateSubscriber("SampleService_Kestrel", ConsulSubscriberOptions.Default, new NanoFabric.Router.Throttle.ThrottleSubscriberOptions() { MaxUpdatesPeriod = TimeSpan.FromSeconds(30), MaxUpdatesPerPeriod = 20 }); serviceSubscriber.StartSubscription().ConfigureAwait(false).GetAwaiter().GetResult(); ILoadBalancer loadBalancer = new RoundRobinLoadBalancer(serviceSubscriber); var endPoint = loadBalancer.Endpoint().ConfigureAwait(false).GetAwaiter().GetResult(); httpClient.SetBearerToken(tokenResponse.AccessToken); string response = await httpClient.GetStringAsync($"{endPoint.ToUri()}api/values/{new Random().Next()}"); ViewBag.Json = response; return(View()); }
public async Task <TService> GetRemoteService <TService>(string serviceName) where TService : IService <TService> { var serviceSubscriber = _subscriberFactory.CreateSubscriber(serviceName); await serviceSubscriber.StartSubscription(); serviceSubscriber.EndpointsChanged += async(sender, eventArgs) => { var endpoints = await serviceSubscriber.Endpoints(); var servicesInfo = string.Join(",", endpoints); }; ILoadBalancer balancer = new RoundRobinLoadBalancer(serviceSubscriber); var endPoint = await balancer.Endpoint(); var channel = _rpcChannelFactory.Get(endPoint.Address, endPoint.Port); return(MagicOnionClient.Create <TService>(channel)); }
public async Task Endpoint_OneEndpoint_ReturnsEndpoint() { var endpoint = new RegistryInformation { Address = Guid.NewGuid().ToString(), Port = 123 }; var subscriber = Substitute.For <IServiceSubscriber>(); subscriber.Endpoints().Returns(Task.FromResult(new List <RegistryInformation> { endpoint })); var lb = new RoundRobinLoadBalancer(subscriber); var actual = await lb.Endpoint(); Assert.Equal(endpoint.Address, actual.Address); Assert.Equal(endpoint.Port, actual.Port); }
public async Task <IActionResult> CallApi() { var serviceSubscriber = subscriberFactory.CreateSubscriber("SampleService_Kestrel", ConsulSubscriberOptions.Default, new NanoFabric.Router.Throttle.ThrottleSubscriberOptions() { MaxUpdatesPeriod = TimeSpan.FromSeconds(30), MaxUpdatesPerPeriod = 20 }); serviceSubscriber.StartSubscription().ConfigureAwait(false).GetAwaiter().GetResult(); ILoadBalancer loadBalancer = new RoundRobinLoadBalancer(serviceSubscriber); var endPoint = loadBalancer.Endpoint().ConfigureAwait(false).GetAwaiter().GetResult(); string token = await HttpContext.GetTokenAsync("access_token"); httpClient.SetBearerToken(token); string response = await httpClient.GetStringAsync($"{endPoint.ToUri()}api/values/{new Random().Next()}"); ViewBag.Json = JArray.Parse(response).ToString(); return(View()); }
public async Task <TService> GetRemoteService <TService>(string serviceName) where TService : IService <TService> { var serviceSubscriber = _subscriberFactory.CreateSubscriber(serviceName, ConsulSubscriberOptions.Default, new NanoFabric.Router.Throttle.ThrottleSubscriberOptions() { MaxUpdatesPeriod = TimeSpan.FromSeconds(30), MaxUpdatesPerPeriod = 20 }); await serviceSubscriber.StartSubscription(); serviceSubscriber.EndpointsChanged += async(sender, eventArgs) => { var endpoints = await serviceSubscriber.Endpoints(); var servicesInfo = string.Join(",", endpoints); }; ILoadBalancer loadBalancer = new RoundRobinLoadBalancer(serviceSubscriber); var endPoint = await loadBalancer.Endpoint(); var serviceChannel = _grpcChannelFactory.Get(endPoint.Address, endPoint.Port); return(MagicOnionClient.Create <TService>(serviceChannel)); }