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 )客戶端配置
下一節 :