Silo通过SiloHostBuilder
和许多补充选项类以编程方式进行配置。
Silo配置有几个关键方面:
Orleans集群信息
集群提供程序(不知道咋翻译)
Silo到Silo和Client到Silo通信的端点
应用部分
这是Silo配置的示例,该Silo配置定义群集信息,使用Azure群集并配置应用程序部分:
var silo = new SiloHostBuilder() // 集群信息 .Configure<ClusterOptions>(options => { options.ClusterId = "my-first-cluster"; options.ServiceId = "AspNetSampleApp"; }) // 群集提供程序 .UseAzureStorageClustering(options => options.ConnectionString = connectionString) // 端口设置 .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000) // 应用程序部分:只需引用我们使用的一个grain实现类即可 .ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(HelloGrain).Assembly).WithReferences()) // 创建Silo! .Build();
注意:使用UseAzureStorageClustering
需要引用Microsoft.Orleans.Clustering.AzureStorage
下面让我们细分该示例中使用的步骤:
[...] // 集群信息 .Configure<ClusterOptions>(options => { options.ClusterId = "my-first-cluster"; options.ServiceId = "AspNetSampleApp"; }) [...]
这里我们做了两件事:
将设置ClusterId为"my-first-cluster":这是Orleans集群的唯一ID。使用此ID的所有客户端和Silo将能够直接相互通信。但是,您可以选择ClusterId对不同的部署使用不同的名称。
设置ServiceId为"AspNetSampleApp":这是您的应用程序的唯一ID,将由某些提供程序(例如持久性提供程序)使用。此ID应该保持稳定,并且在整个部署中都不应更改。
[...] // 群集提供程序 .UseAzureStorageClustering(options => options.ConnectionString = connectionString) [...]
通常,基于Orleans构建的服务会部署在专用硬件或Azure上的节点群集上。对于开发和基本测试,可以将Orleans部署在单节点配置中。当部署到节点集群中时,Orleans内部实现一组协议以发现和维护集群中Orleans孤岛的成员身份,包括节点故障检测和自动重新配置。
为了可靠地管理群集成员身份,Orleans使用Azure Table,SQL Server或Apache ZooKeeper进行节点同步。
在此示例中,我们使用Azure Table作为成员资格提供程序。(现在微软官网的东西都在推Azure,但是用它多少还是有点麻烦,还好能用SQL Server,后面的笔记中,我更多的可能会去使用SQL Server)
var silo = new SiloHostBuilder() [...] // 端口设置 .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000) [...]
Orleans的Silo有两种典型的端点配置类型:
Silo到Silo的端点,用于同一集群中Silo之间的通信
客户端到Silo(或网关),用于同一集群中的客户端和Silo之间的通信
在示例中,我们使用帮助程序方法.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
,该方法将用于Silo到Silo通信11111的端口设置为,将网关的端口设置为30000。此方法将检测要监听的接口。
在大多数情况下,此方法应该足够了,但是如果需要,我们可以进一步对其进行自定义。
下面是一个如何通过一些端口转发使用外部IP地址的示例:
[...].Configure<EndpointOptions>(options =>{ // 用于 Silo-to-Silo 的端口 options.SiloPort = 11111; // gateway 的端口 options.GatewayPort = 30000; // 在集群中进行注册的IP地址 options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42"); // 监听的silo 远程连接点 options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40000); // 监听的silo 远程端口连接点 options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50000);})//监听的主silo 远程连接点 为空则创建一个主silo连接点.UseDevelopmentClustering(new IPEndPoint(IPAddress.Parse("192.168.8.1"),11111))[...]
在内部,Silo将侦听0.0.0.0:40000
和0.0.0.0:50000
,但是在成员资格提供程序中发布的值将是172.16.0.42:11111
和172.16.0.42:30000
。
[...] // Application parts: just reference one of the grain implementations that we use .ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(ValueGrain).Assembly).WithReferences()) [...];
尽管从技术上来说这不是必需的步骤(如果未配置,Orleans将扫描当前文件夹中的所有程序集),但鼓励开发人员进行配置。此步骤将帮助Orleans加载用户程序集和类型。这些组件称为应用程序零件。所有粒度,粒度接口和序列化程序都是使用“应用程序部件”发现的。
应用部件使用配置IApplicationPartsManager
,这可以使用IClientBuilder
和ISiloHostBuilder
下的ConfigureApplicationParts
扩展方法。该ConfigureApplicationParts
方法接受委托Action<IApplicationPartManager>
。
以下扩展方法IApplicationPartManager
支持常用功能:
AddApplicationPart(assembly)
可以使用此扩展方法添加单个装配件。
AddFromAppDomain()
添加当前加载到中的所有程序集AppDomain。
AddFromApplicationBaseDirectory()
在当前基本路径中加载并添加所有程序集(请参阅参考资料AppDomain.BaseDirectory
)。
通过上述方法添加的程序集可以在其返回类型上使用以下扩展方法进行补充IApplicationPartManagerWithAssemblies
:
WithReferences()
从添加的零件中添加所有引用的装配。这将立即加载所有传递引用的程序集。程序集加载错误将被忽略。
WithCodeGeneration()
为添加的零件生成支持代码,并将其添加到零件管理器中。请注意,这要求Microsoft.Orleans.OrleansCodeGenerator
安装该软件包,通常称为运行时代码生成。
类型发现要求提供的应用程序部分包括特定属性。建议将构建时代码生成程序包(Microsoft.Orleans.CodeGenerator.MSBuild
或Microsoft.Orleans.OrleansCodeGenerator.Build
)添加到每个包含Grains,Grain接口或序列化程序的项目中,以确保存在这些属性。生成时代码生成仅支持C#。对于F#,Visual Basic和其他.NET语言,可以通过上述WithCodeGeneration()
方法在配置期间生成代码。有关代码生成的更多信息,请参见相应的部分。
联系客服