Exemplo n.º 1
0
        private static void Main()
        {
            //客户端基本服务。
            ISerializer <string> serializer          = new JsonSerializer();
            ISerializer <byte[]> byteArraySerializer = new StringByteArraySerializer(serializer);
            ISerializer <object> objectSerializer    = new StringObjectSerializer(serializer);
            IServiceIdGenerator  serviceIdGenerator  = new DefaultServiceIdGenerator(new ConsoleLogger <DefaultServiceIdGenerator>());

            var typeConvertibleService = new DefaultTypeConvertibleService(new[] { new DefaultTypeConvertibleProvider(objectSerializer) }, new ConsoleLogger <DefaultTypeConvertibleService>());
            var serviceRouteManager    = new SharedFileServiceRouteManager("d:\\routes.txt", serializer, new ConsoleLogger <SharedFileServiceRouteManager>());
            //zookeeper服务路由管理者。
            //            var serviceRouteManager = new ZooKeeperServiceRouteManager(new ZooKeeperServiceRouteManager.ZookeeperConfigInfo("172.18.20.132:2181"), serializer, new ConsoleLogger<ZooKeeperServiceRouteManager>());
            //            IAddressSelector addressSelector = new RandomAddressSelector();
            IAddressSelector        addressSelector        = new PollingAddressSelector();
            IAddressResolver        addressResolver        = new DefaultAddressResolver(serviceRouteManager, new ConsoleLogger <DefaultAddressResolver>(), addressSelector);
            ITransportClientFactory transportClientFactory = new DotNettyTransportClientFactory(byteArraySerializer, new ConsoleLogger <DotNettyTransportClientFactory>());
            var remoteInvokeService = new RemoteInvokeService(addressResolver, transportClientFactory, new ConsoleLogger <RemoteInvokeService>());

            //服务代理相关。
            IServiceProxyGenerater serviceProxyGenerater = new ServiceProxyGenerater(serviceIdGenerator);
            var services = serviceProxyGenerater.GenerateProxys(new[] { typeof(IUserService) }).ToArray();
            IServiceProxyFactory serviceProxyFactory = new ServiceProxyFactory(remoteInvokeService, typeConvertibleService);

            //创建IUserService的代理。
            var userService = serviceProxyFactory.CreateProxy <IUserService>(services.Single(typeof(IUserService).IsAssignableFrom));

            var logger = new ConsoleLogger();

            while (true)
            {
                Task.Run(async() =>
                {
                    try
                    {
                        Console.WriteLine($"userService.GetUserName:{await userService.GetUserName(1)}");
                        Console.WriteLine($"userService.GetUserId:{await userService.GetUserId("rabbit")}");
                        Console.WriteLine($"userService.GetUserLastSignInTime:{await userService.GetUserLastSignInTime(1)}");
                        Console.WriteLine($"userService.Exists:{await userService.Exists(1)}");
                        var user = await userService.GetUser(1);
                        Console.WriteLine($"userService.GetUser:name={user.Name},age={user.Age}");
                        Console.WriteLine($"userService.Update:{await userService.Update(1, user)}");
                        Console.WriteLine($"userService.GetDictionary:{(await userService.GetDictionary())["key"]}");
                        await userService.TryThrowException();
                    }
                    catch (RpcRemoteException remoteException)
                    {
                        logger.Error(remoteException.Message);
                    }
                }).Wait();
                Console.ReadLine();
            }
        }
Exemplo n.º 2
0
        public async void PollingAddressSyncTest()
        {
            IAddressSelector selector = new PollingAddressSelector(_serviceRouteManager);

            var context = GetSelectContext();

            var numbers = new List <int>();

            for (var i = 0; i < 500; i++)
            {
                var address = (IpAddressModel)await selector.SelectAsync(context);

                numbers.Add(address.Port);
            }

            var isOk = true;

            for (var i = 0; i < numbers.Count; i++)
            {
                if (numbers.Count == i + 1)
                {
                    break;
                }
                var current = numbers[i];
                var next    = numbers[i + 1];
                if (current == next - 1)
                {
                    continue;
                }
                isOk = false;
                break;
            }
            if (isOk)
            {
                Assert.True(true);
            }
            else
            {
                Assert.False(false, string.Join("", numbers));
            }
        }
Exemplo n.º 3
0
        public async void PollingAddressChangeTest()
        {
            IAddressSelector selector = new PollingAddressSelector(_serviceRouteManager);

            await selector.SelectAsync(GetSelectContext());

            await selector.SelectAsync(GetSelectContext());

            var address = (IpAddressModel)await selector.SelectAsync(GetSelectContext());

            Assert.Equal(3, address.Port);

            //更新路由信息。
            await _serviceRouteManager.SetRoutesAsync(new[]
            {
                new ServiceRoute
                {
                    Address = new[]
                    {
                        new IpAddressModel("127.0.0.1", 0),
                        new IpAddressModel("127.0.0.1", 2)
                    },
                    ServiceDescriptor = new ServiceDescriptor
                    {
                        Id = "service1"
                    }
                }
            });

            address = (IpAddressModel)await selector.SelectAsync(GetSelectContext());

            Assert.Equal(0, address.Port);
            address = (IpAddressModel)await selector.SelectAsync(GetSelectContext());

            Assert.Equal(2, address.Port);

            ((TestServiceRouteManager)_serviceRouteManager).Reset();
        }