服務端配置 Silo通過 和許多補充選項類以編程方式進行配置。 Silo配置有幾個關鍵方面: + Orleans集群信息 + 集群提供程式(不知道咋翻譯) + Silo到Silo和Client到Silo通信的端點 + 應用部分 這是Silo配置的示例,該Silo配置定義群集信息,使用Azure群集並 ...
服務端配置
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
下麵讓我們細分該示例中使用的步驟:
Orleans集群信息
[...]
// 集群信息
.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-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 )客戶端配置
下一節 :Orleans[NET Core 3.1] 學習筆記(四)( 1 )創建項目