Silo经过SiloHostBuilder
和许多补充选项类以编程方式进行配置。html
Silo配置有几个关键方面:git
这是Silo配置的示例,该Silo配置定义群集信息,使用Azure群集并配置应用程序部分:github
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
编程
下面让咱们细分该示例中使用的步骤:socket
[...] // 集群信息 .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进行节点同步。ui
在此示例中,咱们使用Azure Table做为成员资格提供程序。(如今微软官网的东西都在推Azure,可是用它多少仍是有点麻烦,还好能用SQL Server,后面的笔记中,我更多的可能会去使用SQL Server)this
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-to-silo 通讯的端口 options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40000); // The socket used by the gateway will bind to this endpoint options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50000); }) [...]
在内部,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()
方法在配置期间生成代码。有关代码生成的更多信息,请参见相应的部分。
目录 : Orleans[NET Core 3.1] 学习笔记(一).NET环境下的分布式应用程序
上一节 : Orleans[NET Core 3.1] 学习笔记(三)( 2 )客户端配置
下一节 :