UseOrleansClient 配置流程 应用程序HostBuilderOrleansClientGenericHostExtensionsClientBuilderDefaultClientServicesIClusterClientHost.CreateDefaultBuilder(args).UseOrleansClient(clientBuilder => ...)UseOrleansClient(configureDelegate)检查 HasOrleansSiloBuilder设置 HasOrleansClientBuilder = "true"ConfigureServices((ctx, services) => ...)AddOrleansClient(services, configuration)new ClientBuilder(services, config)AddDefaultServices(this)注册 IClusterClient注册 ClientMessageCenter注册 ConnectionManager注册序列化服务返回配置好的 Host.Build()创建 IClusterClient 实例客户端连接到 Orleans 集群只能调用 Grain 方法应用程序HostBuilderOrleansClientGenericHostExtensionsClientBuilderDefaultClientServicesIClusterClient UseOrleans 配置流程 应用程序HostBuilderOrleansSiloGenericHostExtensionsSiloBuilderDefaultSiloServicesSiloIClusterClientHost.CreateDefaultBuilder(args).UseOrleans(siloBuilder => ...)UseOrleans(configureDelegate)检查 HasOrleansClientBuilder设置 HasOrleansSiloBuilder = "true"ConfigureServices((context, services) => ...)AddOrleansCore(services, configuration)new SiloBuilder(services, config)AddDefaultServices(this)注册所有客户端服务注册 Silo 实例注册 Catalog注册 LocalGrainDirectory注册 MessageCenter注册 MembershipService注册存储提供程序注册流提供程序返回配置好的 Host.Build()创建 Silo 实例创建内置 IClusterClientSilo 作为集群节点运行可以承载和执行 Grain内置客户端用于内部通信应用程序HostBuilderOrleansSiloGenericHostExtensionsSiloBuilderDefaultSiloServicesSiloIClusterClient 配置互斥性检查流程 应用程序HostBuilderOrleansClientGenericHostExtensionsOrleansSiloGenericHostExtensionsOrleansConfigurationException尝试同时配置客户端和 Silo.UseOrleansClient(...)UseOrleansClient()设置 HasOrleansClientBuilder = "true".UseOrleans(...)UseOrleans()检查 HasOrleansClientBuilder抛出 GetOrleansClientAddedException()"Do not call both UseOrleansClient with UseOrleans...".UseOrleans(...)UseOrleans()设置 HasOrleansSiloBuilder = "true".UseOrleansClient(...)UseOrleansClient()检查 HasOrleansSiloBuilder抛出 GetOrleansSiloAddedException()"Do not call both UseOrleansClient with UseOrleans..."alt[先配置 UseOrleansClient][先配置 UseOrleans]应用程序HostBuilderOrleansClientGenericHostExtensionsOrleansSiloGenericHostExtensionsOrleansConfigurationException UseLocalhostClustering 配置差异 IClientBuilder/ISiloBuilderClientLocalhostConfigSiloLocalhostConfigEndpointOptionsClusterOptionsUseLocalhostClustering(gatewayPort, serviceId, clusterId)UseLocalhostClustering(gatewayPorts[], serviceId, clusterId)UseStaticClustering(gatewayEndpoints[])配置静态集群连接仅配置网关端口设置服务ID和集群IDUseLocalhostClustering(siloPort, gatewayPort, primarySiloEndpoint, serviceId, clusterId)Configure<EndpointOptions>()设置 AdvertisedIPAddress = Loopback设置 SiloPort设置 GatewayPortUseDevelopmentClustering()Configure<ClusterOptions>()设置 ServiceId设置 ClusterId配置完整的 Silo 端点配置开发集群设置主 Silo 端点alt[客户端配置 (IClientBuilder)][Silo 配置 (ISiloBuilder)]IClientBuilder/ISiloBuilderClientLocalhostConfigSiloLocalhostConfigEndpointOptionsClusterOptions 运行时启动流程对比 应用程序HostIClusterClientSiloOrleans 集群host.StartAsync()启动客户端连接到集群网关返回可用 Silo 列表客户端就绪启动完成轻量级启动仅建立连接快速就绪host.StartAsync()启动 Silo初始化运行时组件启动消息中心启动目录服务启动成员服务加入集群确认成员身份启动 Grain 目录启动存储提供程序启动流提供程序Silo 就绪启动完成重量级启动完整运行时初始化较慢但功能完整alt[客户端启动流程][Silo 启动流程]应用程序HostIClusterClientSiloOrleans 集群 服务注册差异对比 UseOrleansClientUseOrleansHostBuilder配置类型ClientBuilderSiloBuilderDefaultClientServicesDefaultSiloServices客户端服务Silo 服务IClusterClientClientMessageCenterConnectionManager序列化服务日志服务所有客户端服务Silo 实例CatalogLocalGrainDirectoryMessageCenterMembershipService存储提供程序流提供程序 这些时序图清晰地展示了两种配置方式在初始化、服务注册、运行时行为等方面的差异,帮助开发者更好地理解何时使用哪种配置方式。