/// <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); }
/// <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); }
/// <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); }
public static IRpcBuilder WithOptions(this IRpcBuilder builder, Action <RpcServerConfiguration> configureOptions) { var configuration = new RpcServerConfiguration(); configureOptions?.Invoke(configuration); builder.Services.Configure(configureOptions); return(builder); }
/// <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); }
/// <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> >()))); }
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()); }
/// <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> >()))); }
/// <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); }
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> >() ))); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
public static IRpcBuilder WithRequestMatcher <T>(this IRpcBuilder builder) where T : class, IRpcRequestMatcher { builder.Services.AddScoped <IRpcRequestMatcher, T>(); return(builder); }
/// <summary> /// 使用Json编解码器。 /// </summary> /// <param name="builder">Rpc服务构建者。</param> /// <returns>Rpc服务构建者。</returns> public static IRpcBuilder UseJsonCodec(this IRpcBuilder builder) { return(builder.UseCodec <JsonTransportMessageCodecFactory>()); }
/// <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); }
/// <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); }
/// <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); }
/// <summary> /// 使用随机的地址选择器。 /// </summary> /// <param name="builder">Rpc服务构建者。</param> /// <returns>Rpc服务构建者。</returns> public static IRpcBuilder UseRandomAddressSelector(this IRpcBuilder builder) { builder.Services.AddSingleton <IAddressSelector, RandomAddressSelector>(); return(builder); }
/// <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); }
/// <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); }