コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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());
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: zzpgeorge/NanoFabric
    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();
    }
コード例 #6
0
        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);
        }
コード例 #7
0
        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());
        }
コード例 #8
0
        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));
        }
コード例 #9
0
        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);
        }
コード例 #10
0
ファイル: HomeController.cs プロジェクト: zz110/NanoFabric
        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());
        }
コード例 #11
0
        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));
        }