电竞比分网-中国电竞赛事及体育赛事平台

分享

Orleans[NET Core 3.1] 學(xué)習(xí)筆記(三)( 3 )服務(wù)端配置

 怡紅公子0526 2021-04-21

服務(wù)端配置

Silo通過SiloHostBuilder和許多補(bǔ)充選項類以編程方式進(jìn)行配置。

Silo配置有幾個關(guān)鍵方面:

  • Orleans集群信息

  • 集群提供程序(不知道咋翻譯)

  • Silo到Silo和Client到Silo通信的端點

  • 應(yīng)用部分

這是Silo配置的示例,該Silo配置定義群集信息,使用Azure群集并配置應(yīng)用程序部分:

var silo = new SiloHostBuilder()
    // 集群信息
    .Configure<ClusterOptions>(options =>
    {
        options.ClusterId = "my-first-cluster";
        options.ServiceId = "AspNetSampleApp";
    })
    // 群集提供程序
    .UseAzureStorageClustering(options => options.ConnectionString = connectionString)
    // 端口設(shè)置
    .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
    // 應(yīng)用程序部分:只需引用我們使用的一個grain實現(xiàn)類即可
    .ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(HelloGrain).Assembly).WithReferences())
    // 創(chuàng)建Silo!
    .Build();

注意:使用UseAzureStorageClustering需要引用Microsoft.Orleans.Clustering.AzureStorage

下面讓我們細(xì)分該示例中使用的步驟:

Orleans集群信息

    [...]
    // 集群信息
    .Configure<ClusterOptions>(options =>
    {
        options.ClusterId = "my-first-cluster";
        options.ServiceId = "AspNetSampleApp";
    })
    [...]

這里我們做了兩件事:

將設(shè)置ClusterId為"my-first-cluster":這是Orleans集群的唯一ID。使用此ID的所有客戶端和Silo將能夠直接相互通信。但是,您可以選擇ClusterId對不同的部署使用不同的名稱。
設(shè)置ServiceId為"AspNetSampleApp":這是您的應(yīng)用程序的唯一ID,將由某些提供程序(例如持久性提供程序)使用。此ID應(yīng)該保持穩(wěn)定,并且在整個部署中都不應(yīng)更改。

集群提供商(什么鬼)

    [...]
    // 群集提供程序
    .UseAzureStorageClustering(options => options.ConnectionString = connectionString)
    [...]

通常,基于Orleans構(gòu)建的服務(wù)會部署在專用硬件或Azure上的節(jié)點群集上。對于開發(fā)和基本測試,可以將Orleans部署在單節(jié)點配置中。當(dāng)部署到節(jié)點集群中時,Orleans內(nèi)部實現(xiàn)一組協(xié)議以發(fā)現(xiàn)和維護(hù)集群中Orleans孤島的成員身份,包括節(jié)點故障檢測和自動重新配置。

為了可靠地管理群集成員身份,Orleans使用Azure Table,SQL Server或Apache ZooKeeper進(jìn)行節(jié)點同步。

在此示例中,我們使用Azure Table作為成員資格提供程序。(現(xiàn)在微軟官網(wǎng)的東西都在推Azure,但是用它多少還是有點麻煩,還好能用SQL Server,后面的筆記中,我更多的可能會去使用SQL Server)

端口

var silo = new SiloHostBuilder()
    [...]
    // 端口設(shè)置
    .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
    [...]

Orleans的Silo有兩種典型的端點配置類型:

Silo到Silo的端點,用于同一集群中Silo之間的通信
客戶端到Silo(或網(wǎng)關(guān)),用于同一集群中的客戶端和Silo之間的通信
在示例中,我們使用幫助程序方法.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000),該方法將用于Silo到Silo通信11111的端口設(shè)置為,將網(wǎng)關(guān)的端口設(shè)置為30000。此方法將檢測要監(jiān)聽的接口。

在大多數(shù)情況下,此方法應(yīng)該足夠了,但是如果需要,我們可以進(jìn)一步對其進(jìn)行自定義。

下面是一個如何通過一些端口轉(zhuǎn)發(fā)使用外部IP地址的示例:

[...]
.Configure<EndpointOptions>(options =>
{
    // 用于 Silo-to-Silo 的端口
    options.SiloPort = 11111;
    //  gateway 的端口
    options.GatewayPort = 30000;
    // 在集群中進(jìn)行注冊的IP地址
    options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42");
    // 監(jiān)聽的silo 遠(yuǎn)程連接點
    options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40000);
    // 監(jiān)聽的silo 遠(yuǎn)程端口連接點
    options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50000);

})
//監(jiān)聽的主silo 遠(yuǎn)程連接點 為空則創(chuàng)建一個主silo連接點
.UseDevelopmentClustering(new IPEndPoint(IPAddress.Parse("192.168.8.1"),11111))
[...]

在內(nèi)部,Silo將偵聽0.0.0.0:400000.0.0.0:50000,但是在成員資格提供程序中發(fā)布的值將是172.16.0.42:11111172.16.0.42:30000。

應(yīng)用部分

    [...]
    // Application parts: just reference one of the grain implementations that we use
    .ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(ValueGrain).Assembly).WithReferences())
    [...];

盡管從技術(shù)上來說這不是必需的步驟(如果未配置,Orleans將掃描當(dāng)前文件夾中的所有程序集),但鼓勵開發(fā)人員進(jìn)行配置。此步驟將幫助Orleans加載用戶程序集和類型。這些組件稱為應(yīng)用程序零件。所有粒度,粒度接口和序列化程序都是使用“應(yīng)用程序部件”發(fā)現(xiàn)的。

應(yīng)用部件使用配置IApplicationPartsManager,這可以使用IClientBuilderISiloHostBuilder下的ConfigureApplicationParts擴(kuò)展方法。該ConfigureApplicationParts方法接受委托Action<IApplicationPartManager>。

以下擴(kuò)展方法IApplicationPartManager支持常用功能:

  • AddApplicationPart(assembly) 可以使用此擴(kuò)展方法添加單個裝配件。

  • AddFromAppDomain()添加當(dāng)前加載到中的所有程序集AppDomain。

  • AddFromApplicationBaseDirectory()在當(dāng)前基本路徑中加載并添加所有程序集(請參閱參考資料AppDomain.BaseDirectory)。

通過上述方法添加的程序集可以在其返回類型上使用以下擴(kuò)展方法進(jìn)行補(bǔ)充IApplicationPartManagerWithAssemblies

  • WithReferences()從添加的零件中添加所有引用的裝配。這將立即加載所有傳遞引用的程序集。程序集加載錯誤將被忽略。

  • WithCodeGeneration()為添加的零件生成支持代碼,并將其添加到零件管理器中。請注意,這要求Microsoft.Orleans.OrleansCodeGenerator安裝該軟件包,通常稱為運行時代碼生成。

類型發(fā)現(xiàn)要求提供的應(yīng)用程序部分包括特定屬性。建議將構(gòu)建時代碼生成程序包(Microsoft.Orleans.CodeGenerator.MSBuildMicrosoft.Orleans.OrleansCodeGenerator.Build)添加到每個包含Grains,Grain接口或序列化程序的項目中,以確保存在這些屬性。生成時代碼生成僅支持C#。對于F#,Visual Basic和其他.NET語言,可以通過上述WithCodeGeneration()方法在配置期間生成代碼。有關(guān)代碼生成的更多信息,請參見相應(yīng)的部分。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多