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,objectSerializer, 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(); } }
private static void Main() { //服务路由配置信息获取处(与Echo.Server为强制约束)。 var configuration = new ConfigurationBuilder() .SetBasePath("d:\\") .AddJsonFile("routes.txt", false, true) .Build(); //客户端基本服务。 ISerializer serializer = new JsonSerializer(); IServiceIdGenerator serviceIdGenerator = new DefaultServiceIdGenerator(); var serviceRouteProvider = new DefaultServiceRouteProvider(configuration.GetSection("routes")); var serviceRouteManager = new DefaultServiceRouteManager(new[] { serviceRouteProvider }); IAddressResolver addressResolver = new DefaultAddressResolver(serviceRouteManager); ITransportClientFactory transportClientFactory = new NettyTransportClientFactory(serializer); var remoteInvokeService = new RemoteInvokeService(addressResolver, transportClientFactory, serializer); //服务代理相关。 IServiceProxyGenerater serviceProxyGenerater = new ServiceProxyGenerater(serviceIdGenerator); var services = serviceProxyGenerater.GenerateProxys(new[] { typeof(IUserService) }).ToArray(); IServiceProxyFactory serviceProxyFactory = new ServiceProxyFactory(remoteInvokeService, serializer); //创建IUserService的代理。 var userService = serviceProxyFactory.CreateProxy<IUserService>(services.Single(typeof(IUserService).IsAssignableFrom)); while (true) { Task.Run(async () => { try { Console.WriteLine(DateTime.Now); 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)}"); } catch (Exception exception) { Console.WriteLine("发生了错误。" + exception.Message); } }).Wait(); Console.ReadLine(); } }
private static void Main() { //客户端基本服务。 ISerializer serializer = new JsonSerializer(); IServiceIdGenerator serviceIdGenerator = new DefaultServiceIdGenerator(); var typeConvertibleService = new DefaultTypeConvertibleService(new[] { new DefaultTypeConvertibleProvider(serializer) }); var serviceRouteManager = new SharedFileServiceRouteManager("d:\\routes.txt", serializer); //zookeeper服务路由管理者。 // var serviceRouteManager = new ZooKeeperServiceRouteManager(new ZooKeeperServiceRouteManager.ZookeeperConfigInfo("172.18.20.132:2181"), serializer); IAddressResolver addressResolver = new DefaultAddressResolver(serviceRouteManager); ITransportClientFactory transportClientFactory = new NettyTransportClientFactory(serializer); var remoteInvokeService = new RemoteInvokeService(addressResolver, transportClientFactory, serializer); //服务代理相关。 IServiceProxyGenerater serviceProxyGenerater = new ServiceProxyGenerater(serviceIdGenerator); var services = serviceProxyGenerater.GenerateProxys(new[] { typeof(IUserService) }).ToArray(); IServiceProxyFactory serviceProxyFactory = new ServiceProxyFactory(remoteInvokeService, serializer, typeConvertibleService); //创建IUserService的代理。 var userService = serviceProxyFactory.CreateProxy<IUserService>(services.Single(typeof(IUserService).IsAssignableFrom)); while (true) { Task.Run(async () => { try { Console.WriteLine(DateTime.Now); 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)}"); } catch (Exception exception) { Console.WriteLine("发生了错误。" + exception.Message); } }).Wait(); Console.ReadLine(); } }
private static void Main() { var assemblyFiles = Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "assemblies"), "*.dll").ToArray(); var assemblies = assemblyFiles.Select(i => Assembly.Load(File.ReadAllBytes(i))).ToArray(); IServiceProxyGenerater serviceProxyGenerater = new ServiceProxyGenerater(new DefaultServiceIdGenerator()); Console.WriteLine("成功加载了以下程序集"); foreach (var name in assemblies.Select(i => i.GetName().Name)) { Console.WriteLine(name); } var services = assemblies .SelectMany(assembly => assembly.GetExportedTypes()) .Where(i => i.IsInterface && i.GetCustomAttribute<RpcServiceAttribute>() != null); while (true) { Console.WriteLine("1.生成客户端代理程序集"); Console.WriteLine("2.生成客户端代理代码"); var command = Console.ReadLine(); Func<IEnumerable<SyntaxTree>> getTrees = () => { var trees = new List<SyntaxTree>(); foreach (var service in services) { trees.Add(serviceProxyGenerater.GenerateProxyTree(service)); } return trees; }; var outputDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "outputs"); if (!Directory.Exists(outputDirectory)) { Directory.CreateDirectory(outputDirectory); } switch (command) { case "1": var bytes = CompilationUtilitys.CompileClientProxy(getTrees(), assemblyFiles.Select(file => MetadataReference.CreateFromFile(file))); { var fileName = Path.Combine(outputDirectory, "Rabbit.Rpc.ClientProxys.dll"); File.WriteAllBytes(fileName, bytes); Console.WriteLine($"生成成功,路径:{fileName}"); } break; case "2": foreach (var syntaxTree in getTrees()) { var className = ((ClassDeclarationSyntax)((CompilationUnitSyntax)syntaxTree.GetRoot()).Members[0]).Identifier.Value; var code = syntaxTree.ToString(); var fileName = Path.Combine(outputDirectory, $"{className}.cs"); File.WriteAllText(fileName, code, Encoding.UTF8); Console.WriteLine($"生成成功,路径:{fileName}"); } break; default: Console.WriteLine("无效的输入!"); continue; } } }