Exemplo n.º 1
0
        /// <summary>
        /// 使用编解码器
        /// </summary>
        /// <param name="builder">Rpc服务构建者</param>
        /// <param name="codecFactory">编解码器工厂创建委托</param>
        /// <returns>Rpc服务构建者</returns>
        public static IRpcBuilder UseCodec(this IRpcBuilder builder,
                                           Func <IServiceProvider, ITransportMessageCodecFactory> codecFactory)
        {
            builder.Services.AddSingleton(codecFactory);

            return(builder);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 设置服务地址选择器。
        /// </summary>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <param name="factory">服务地址选择器实例工厂。</param>
        /// <returns>Rpc服务构建者。</returns>
        public static IRpcBuilder UseAddressSelector(this IRpcBuilder builder,
                                                     Func <IServiceProvider, IAddressSelector> factory)
        {
            builder.Services.AddSingleton(factory);

            return(builder);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 添加服务运行时服务。
        /// </summary>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <returns>Rpc服务构建者。</returns>
        public static IRpcBuilder AddServiceRuntime(this IRpcBuilder builder)
        {
            var services = builder.Services;

            //            services.AddSingleton<IServiceInstanceFactory, DefaultServiceInstanceFactory>();
            services.AddSingleton <IClrServiceEntryFactory, ClrServiceEntryFactory>();
            services.AddSingleton <IServiceEntryProvider>(provider =>
            {
#if NET
                var assemblys = AppDomain.CurrentDomain.GetAssemblies();
#else
                //var assemblys = DependencyContext.Default.RuntimeLibraries.SelectMany(i => i.GetDefaultAssemblyNames(DependencyContext.Default).Select(z => Assembly.Load(new AssemblyName(z.Name))));
#endif

                //var types = assemblys.Where(i => i.IsDynamic == false).SelectMany(i => i.ExportedTypes).ToArray();

                //return new AttributeServiceEntryProvider(types, provider.GetRequiredService<IClrServiceEntryFactory>(),
                //provider.GetRequiredService<ILogger<AttributeServiceEntryProvider>>());

                return(new AttributeServiceEntryProvider(AppDomain.CurrentDomain.GetAssemblies().Where(i => i.IsDynamic == false).SelectMany(i => i.ExportedTypes).ToArray(),
                                                         provider.GetRequiredService <IClrServiceEntryFactory>(),
                                                         provider.GetRequiredService <ILogger <AttributeServiceEntryProvider> >()));
            });
            services.AddSingleton <IServiceEntryManager, DefaultServiceEntryManager>();
            services.AddSingleton <IServiceEntryLocate, DefaultServiceEntryLocate>();
            services.AddSingleton <IServiceExecutor, DefaultServiceExecutor>();

            return(builder);
        }
Exemplo n.º 4
0
        public static IRpcBuilder WithOptions(this IRpcBuilder builder, Action <RpcServerConfiguration> configureOptions)
        {
            var configuration = new RpcServerConfiguration();

            configureOptions?.Invoke(configuration);
            builder.Services.Configure(configureOptions);
            return(builder);
        }
Exemplo n.º 5
0
 /// <summary>
 /// 设置共享文件路由管理者。
 /// </summary>
 /// <param name="builder">Rpc服务构建者。</param>
 /// <param name="configInfo">ZooKeeper设置信息。</param>
 /// <returns>Rpc服务构建者。</returns>
 public static IRpcBuilder UseFilesRouteManager(this IRpcBuilder builder, string filePath)
 {
     return(builder.UseRouteManager(provider => new FilesServiceRouteManager(
                                        filePath,
                                        provider.GetRequiredService <ISerializer <string> >(),
                                        provider.GetRequiredService <IServiceRouteFactory>(),
                                        provider.GetRequiredService <ILogger <FilesServiceRouteManager> >())));
 }
        /// <summary>
        /// 添加RPC服务认证 | 认证在服务端
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="authorizationServerProvider"></param>
        /// <returns></returns>
        public static IRpcBuilder AddAuthentication(this IRpcBuilder builder, Type authorizationServerProvider = null)
        {
            var services = builder.Services;

            services.AddSingleton(typeof(IAuthorizationServerProvider),
                                  authorizationServerProvider == null ? typeof(DefaultAuthorizationServerProvider) : authorizationServerProvider);

            return(builder);
        }
        public static IRpcBuilder AddClientProxy(this IRpcBuilder builder)
        {
            var services = builder.Services;

            services.RegisterType <ServiceProxyFactory>().As <IServiceProxyFactory>();
            services.RegisterType <ServiceProxyGenerater>().As <IServiceProxyGenerater>();

            return(builder);
        }
Exemplo n.º 8
0
 /// <summary>
 /// 设置注册中心路由管理。
 /// </summary>
 /// <param name="builder">Rpc服务构建者。</param>
 /// <param name="filePath">文件路径。</param>
 /// <returns>Rpc服务构建者。</returns>
 public static IRpcBuilder UseRegistryRouteManager(this IRpcBuilder builder)
 {
     return(builder.UseRouteManager(provider =>
                                    new RegistryServiceRouteManager(
                                        provider.GetRequiredService <RegistryService>(),
                                        provider.GetRequiredService <ISerializer <string> >(),
                                        provider.GetRequiredService <IServiceRouteFactory>(),
                                        provider.GetRequiredService <ILogger <RegistryServiceRouteManager> >())));
 }
Exemplo n.º 9
0
        public static IRpcBuilder AddClientProxy(this IRpcBuilder builder)
        {
            var services = builder.Services;

            services.AddSingleton <IServiceProxyGenerater, ServiceProxyGenerater>();
            services.AddSingleton <IServiceProxyFactory, ServiceProxyFactory>();

            return(builder);
        }
        /// <summary>
        /// 添加Json序列化支持
        /// </summary>
        /// <param name="builder">Rpc服务构建者</param>
        /// <returns>Rpc服务构建者</returns>
        private static IRpcBuilder AddJsonSerialization(this IRpcBuilder builder)
        {
            var services = builder.Services;

            services.RegisterType <JsonSerializer>().As <ISerializer <string> >();
            services.RegisterType <StringByteArraySerializer>().As <ISerializer <byte[]> >();
            services.RegisterType <StringObjectSerializer>().As <ISerializer <object> >();
            return(builder);
        }
        /// <summary>
        /// 添加客户端运行时服务
        /// </summary>
        /// <param name="builder">Rpc服务构建者</param>
        /// <returns>Rpc服务构建者</returns>
        public static IRpcBuilder AddClientRuntime(this IRpcBuilder builder)
        {
            var services = builder.Services;

            services.RegisterType <DefaultHealthCheckService>().As <IHealthCheckService>();
            services.RegisterType <DefaultAddressResolver>().As <IAddressResolver>();
            services.RegisterType <RemoteInvokeService>().As <IRemoteInvokeService>();
            return(builder.UsePollingAddressSelector());
        }
Exemplo n.º 12
0
        /// <summary>
        /// 添加Json序列化支持。
        /// </summary>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <returns>Rpc服务构建者。</returns>
        public static IRpcBuilder AddJsonSerialization(this IRpcBuilder builder)
        {
            var services = builder.Services;

            services.AddSingleton <ISerializer <string>, JsonSerializer>();
            services.AddSingleton <ISerializer <byte[]>, StringByteArraySerializer>();
            services.AddSingleton <ISerializer <object>, StringObjectSerializer>();

            return(builder);
        }
 /// <summary>
 /// 设置共享文件路由管理者。
 /// </summary>
 /// <param name="builder">Rpc服务构建者。</param>
 /// <param name="configInfo">ZooKeeper设置信息。</param>
 /// <returns>Rpc服务构建者。</returns>
 public static IRpcBuilder UseZooKeeperRouteManager(this IRpcBuilder builder, ZooKeeperServiceRouteManager.ZookeeperConfigInfo configInfo)
 {
     return(builder.UseRouteManager(provider =>
                                    new ZooKeeperServiceRouteManager(
                                        configInfo,
                                        provider.GetRequiredService <ISerializer <byte[]> >(),
                                        provider.GetRequiredService <ISerializer <string> >(),
                                        provider.GetRequiredService <IServiceRouteFactory>(),
                                        provider.GetRequiredService <ILogger <ZooKeeperServiceRouteManager> >())));
 }
Exemplo n.º 14
0
        /// <summary>
        /// 添加客户端运行时服务。
        /// </summary>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <returns>Rpc服务构建者。</returns>
        public static IRpcBuilder AddClientRuntime(this IRpcBuilder builder)
        {
            var services = builder.Services;

            //services.AddSingleton<IHealthCheckService, DefaultHealthCheckService>();
            //services.AddSingleton<IAddressResolver, DefaultAddressResolver>();
            services.AddSingleton <IRemoteInvokeService, RemoteInvokeService>();

            return(builder);
        }
Exemplo n.º 15
0
 public static IRpcBuilder UseConsulRouteManager(this IRpcBuilder builder,
                                                 RpcOptionsConfiguration rpcOptionsConfiguration)
 {
     return(builder.UseRouteManager(provider =>
                                    new ConsulServiceRouteManager(
                                        rpcOptionsConfiguration,
                                        provider.GetRequiredService <ISerializer <byte[]> >(),
                                        provider.GetRequiredService <ISerializer <string> >(),
                                        provider.GetRequiredService <IServiceRouteFactory>(),
                                        provider.GetRequiredService <ILogger <ConsulServiceRouteManager> >()
                                        )));
 }
Exemplo n.º 16
0
        /// <summary>
        /// 添加代理。
        /// </summary>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <returns>Rpc服务构建者。</returns>
        public static IRpcBuilder AddServiceProxy(this IRpcBuilder builder)
        {
            var services = builder.Services;

            services.AddSingleton <IServiceProxyGenerater, ServiceProxyGenerater>();
            services.AddSingleton <IServiceProxyFactory>(sp => {
                var proxType = RegisterProxType(sp);
                return(new ServiceProxyFactory(sp.GetRequiredService <IRemoteInvokeService>(), sp.GetRequiredService <ITypeConvertibleService>(), proxType.serviceTypes, proxType.clientTypes));
            });
            services.AddSingleton <IServiceProxyProvider, ServiceProxyProvider>();
            services.AddSingleton <RemoteServiceProxy>();

            return(builder);
        }
        /// <summary>
        /// 使用DotNetty进行传输。
        /// </summary>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <returns>Rpc服务构建者。</returns>
        public static IRpcBuilder UseDotNettyTransport(this IRpcBuilder builder)
        {
            var services = builder.Services;

            services.RegisterType <DefaultDotNettyTransportClientFactory>().As <ITransportClientFactory>();
            services.RegisterType <DefaultDotNettyServerMessageListener>();
            services.RegisterType <DefaultServiceHost>().As <IServiceHost>();
            services.Register <IServiceHost>(r => new DefaultServiceHost(async endPoint =>
            {
                var messageListener = r.Resolve <DefaultDotNettyServerMessageListener>();
                await messageListener.StartAsync(endPoint);
                return(messageListener);
            }, r.Resolve <IServiceExecutor>()));

            return(builder);
        }
Exemplo n.º 18
0
        /// <summary>
        /// 添加服务运行时服务
        /// </summary>
        /// <param name="builder">Rpc服务构建者</param>
        /// <returns>Rpc服务构建者</returns>
        public static IRpcBuilder AddService(this IRpcBuilder builder)
        {
            var services = builder.Services;

            services.AddSingleton <IServiceEntryFactory, ServiceEntryFactory>();
            services.AddSingleton <IServiceEntryProvider>(provider =>
                                                          new AttributeServiceEntryProvider(
                                                              AppDomain.CurrentDomain.GetAssemblies().AsParallel().Where(i => i.IsDynamic == false).SelectMany(i => i.ExportedTypes)
                                                              .ToArray(),
                                                              provider.GetRequiredService <IServiceEntryFactory>(),
                                                              provider.GetRequiredService <ILogger <AttributeServiceEntryProvider> >()));
            services.AddSingleton <IServiceEntryManager, DefaultServiceEntryManager>();
            services.AddSingleton <IServiceEntryLocate, DefaultServiceEntryLocate>();
            services.AddSingleton <IServiceExecutor, DefaultServiceExecutor>();

            return(builder);
        }
        /// <summary>
        /// 使用DotNetty进行传输。
        /// </summary>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <returns>Rpc服务构建者。</returns>
        public static IRpcBuilder UseDotNettyTransport(this IRpcBuilder builder)
        {
            var services = builder.Services;

            services.AddSingleton <ITransportClientFactory, DotNettyTransportClientFactory>();

            services.AddSingleton <DotNettyServerMessageListener>();

            services.AddSingleton <IServiceHost, DefaultServiceHost>(provider => new DefaultServiceHost(async endPoint =>
            {
                var messageListener = provider.GetRequiredService <DotNettyServerMessageListener>();
                await messageListener.StartAsync(endPoint);
                return(messageListener);
            }, provider.GetRequiredService <IServiceExecutor>()));

            return(builder);
        }
        /// <summary>
        /// 添加代理。
        /// </summary>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <returns>Rpc服务构建者。</returns>
        public static IRpcBuilder AddServiceProxy(this IRpcBuilder builder)
        {
            var services = builder.Services;

            services.AddSingleton <IServiceProxyGenerater, ServiceProxyGenerater>();
            services.AddSingleton <IServiceProxyFactory>(sp =>
            {
                var now = DateTime.Now;
                var(serviceTypes, clientTypes) = RegisterProxType(sp);
                Console.WriteLine($"创建代理耗时:{(DateTime.Now - now).TotalMilliseconds}毫秒");
                return(new ServiceProxyFactory(sp.GetRequiredService <IRemoteInvokeService>(), sp.GetRequiredService <ITypeConvertibleService>(), serviceTypes, clientTypes));
            });
            services.AddSingleton <IServiceProxyProvider, ServiceProxyProvider>();
            services.AddSingleton <RemoteServiceProxy>();

            return(builder);
        }
Exemplo n.º 21
0
        /// <summary>
        /// 添加服务运行时服务
        /// </summary>
        /// <param name="builder">Rpc服务构建者</param>
        /// <returns>Rpc服务构建者</returns>
        public static IRpcBuilder AddService(this IRpcBuilder builder)
        {
            var services = builder.Services;

            services.AddSingleton <IServiceEntryFactory, ServiceEntryFactory>();
            services.AddSingleton <IServiceEntryProvider>(provider =>
            {
                var assembles = DependencyContext.Default.RuntimeLibraries.SelectMany(i =>
                                                                                      i.GetDefaultAssemblyNames(DependencyContext.Default).Select(z => Assembly.Load(new AssemblyName(z.Name))));

                var types = assembles.Where(i => i.IsDynamic == false).SelectMany(i => i.ExportedTypes).ToArray();

                return(new AttributeServiceEntryProvider(types, provider.GetRequiredService <IServiceEntryFactory>(),
                                                         provider.GetRequiredService <ILogger <AttributeServiceEntryProvider> >()));
            });
            services.AddSingleton <IServiceEntryManager, DefaultServiceEntryManager>();
            services.AddSingleton <IServiceEntryLocate, DefaultServiceEntryLocate>();
            services.AddSingleton <IServiceExecutor, DefaultServiceExecutor>();

            return(builder);
        }
Exemplo n.º 22
0
 /// <summary>
 /// 设置服务路由管理者。
 /// </summary>
 /// <typeparam name="T">服务路由管理者实现。</typeparam>
 /// <param name="builder">Rpc服务构建者。</param>
 /// <returns>Rpc服务构建者。</returns>
 public static IRpcBuilder UseRouteManager <T>(this IRpcBuilder builder) where T : class, IServiceRouteManager
 {
     builder.Services.AddSingleton <IServiceRouteManager, T>();
     return(builder);
 }
Exemplo n.º 23
0
 public static IRpcBuilder WithRequestMatcher <T>(this IRpcBuilder builder)
     where T : class, IRpcRequestMatcher
 {
     builder.Services.AddScoped <IRpcRequestMatcher, T>();
     return(builder);
 }
Exemplo n.º 24
0
 /// <summary>
 /// 使用Json编解码器。
 /// </summary>
 /// <param name="builder">Rpc服务构建者。</param>
 /// <returns>Rpc服务构建者。</returns>
 public static IRpcBuilder UseJsonCodec(this IRpcBuilder builder)
 {
     return(builder.UseCodec <JsonTransportMessageCodecFactory>());
 }
Exemplo n.º 25
0
 /// <summary>
 /// 设置服务路由管理者。
 /// </summary>
 /// <param name="builder">Rpc服务构建者。</param>
 /// <param name="factory">服务路由管理者实例工厂。</param>
 /// <returns>Rpc服务构建者。</returns>
 public static IRpcBuilder UseRouteManager(this IRpcBuilder builder, Func <IServiceProvider, IServiceRouteManager> factory)
 {
     builder.Services.AddSingleton(factory);
     return(builder);
 }
Exemplo n.º 26
0
        /// <summary>
        /// 使用编解码器。
        /// </summary>
        /// <typeparam name="T">编解码器工厂实现类型。</typeparam>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <returns>Rpc服务构建者。</returns>
        public static IRpcBuilder UseCodec <T>(this IRpcBuilder builder) where T : class, ITransportMessageCodecFactory
        {
            builder.Services.AddSingleton <ITransportMessageCodecFactory, T>();

            return(builder);
        }
Exemplo n.º 27
0
 /// <summary>
 /// 设置服务路由管理者。
 /// </summary>
 /// <param name="builder">Rpc服务构建者。</param>
 /// <param name="instance">服务路由管理者实例。</param>
 /// <returns>Rpc服务构建者。</returns>
 public static IRpcBuilder UseRouteManager(this IRpcBuilder builder, IServiceRouteManager instance)
 {
     builder.Services.AddSingleton(instance);
     return(builder);
 }
Exemplo n.º 28
0
 /// <summary>
 /// 使用随机的地址选择器。
 /// </summary>
 /// <param name="builder">Rpc服务构建者。</param>
 /// <returns>Rpc服务构建者。</returns>
 public static IRpcBuilder UseRandomAddressSelector(this IRpcBuilder builder)
 {
     builder.Services.AddSingleton <IAddressSelector, RandomAddressSelector>();
     return(builder);
 }
Exemplo n.º 29
0
        /// <summary>
        /// 设置服务地址选择器。
        /// </summary>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <param name="instance">地址选择器实例。</param>
        /// <returns>Rpc服务构建者。</returns>
        public static IRpcBuilder UseAddressSelector(this IRpcBuilder builder, IAddressSelector instance)
        {
            builder.Services.AddSingleton(instance);

            return(builder);
        }
Exemplo n.º 30
0
        /// <summary>
        /// 设置共享文件路由管理者。
        /// </summary>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <param name="filePath">文件路径。</param>
        /// <returns>Rpc服务构建者。</returns>

        /*
         * public static IRpcBuilder UseSharedFileRouteManager(this IRpcBuilder builder, string filePath)
         * {
         *  return builder.UseRouteManager(provider =>
         *  new SharedFileServiceRouteManager(
         *      filePath,
         *      provider.GetRequiredService<ISerializer<string>>(),
         *      provider.GetRequiredService<IServiceRouteFactory>(),
         *      provider.GetRequiredService<ILogger<SharedFileServiceRouteManager>>()));
         * }
         */

        #region AddressSelector

        /// <summary>
        /// 设置服务地址选择器。
        /// </summary>
        /// <typeparam name="T">地址选择器实现类型。</typeparam>
        /// <param name="builder">Rpc服务构建者。</param>
        /// <returns>Rpc服务构建者。</returns>
        public static IRpcBuilder UseAddressSelector <T>(this IRpcBuilder builder) where T : class, IAddressSelector
        {
            builder.Services.AddSingleton <IAddressSelector, T>();
            return(builder);
        }