共用方式為


使用 Consul 作為成員資格提供者

Consul 是一個分散式、高可用性且具備數據中心感知的服務發現平台,包括簡單的服務註冊、健康檢查、故障檢測和鍵值儲存。 它建置在數據中心的每個節點都執行 Consul 代理程式作為伺服器或用戶端的前提下。 每個代理程式都會透過可調整的八卦通訊協議進行通訊。

Consul 有詳細的概覽,包括與類似解決方案的比較在這裡

Consul 是以 Go 撰寫,開放原始碼;編譯的下載適用於 macOS X、FreeBSD、Linux、Solaris 和 Windows

為什麼選擇領事?

身為 Orleans 成員資格提供者,當您需要提供不需要潛在客戶擁有現有基礎結構和合作 IT 提供者的內部部署解決方案時,Consul 是不錯的選擇。 Consul 是輕量型單一可執行文件,沒有相依性,因此可以輕鬆地內建到中間件解決方案中。 當 Consul 是您探索、檢查和維護微服務的解決方案時,將其與 Orleans 成員資格完全整合,可以達到簡化和操作方便的效果。 Consul 中也有成員資格數據表(也稱為「Orleans 自定義系統存放區」),其與 Orleans的 叢集管理完全整合。

設定 Consul

Consul.io 上,有關設定穩定的 Consul 叢集的文件非常豐富,在此重複那裡的內容並無意義。 不過,為了您的方便,我們提供本指南,以便您能快速啟動並使用獨立的 Consul 代理程式運行 Orleans。

  1. 建立資料夾以將 Consul 安裝到 中(例如 C:\Consul)。

  2. 建立子資料夾:C:\Consul\Data(如果不存在,Consul 不會建立此目錄)。

  3. 下載,並將 Consul.exe 解壓縮到 C:\Consul

  4. C:\Consul 開啟命令提示字元,然後執行下列命令:

    ./consul.exe agent -server -bootstrap -data-dir "C:\Consul\Data" -client='0.0.0.0'
    

    在上述命令中:

    • agent:指示 Consul 執行裝載服務的代理程式程式。 如果沒有此參數,Consul 進程會嘗試使用 RPC 來設定執行中的代理程式。
    • -server:將代理程式定義為伺服器,而不是用戶端(Consul 用戶端 是裝載所有服務和數據的代理程式,但沒有投票權可決定且無法成為叢集領導者。
    • -bootstrap:叢集中的第一個(且只有第一個!)節點必須初始化,才能擔任叢集的領導角色。
    • -data-dir [path]:指定儲存所有 Consul 數據的路徑,包括叢集成員資格數據表。
    • -client='0.0.0.0':通知領事要開啟服務的IP。

    還有其他許多參數,以及使用 JSON 組態檔的選項。 如需選項的完整清單,請參閱 Consul 檔。

  5. 在瀏覽器中開啟服務 http://localhost:8500/v1/catalog/services端點,確認 Consul 正在執行,並準備好接受來自 Orleans 的成員資格要求。 正常運作時,瀏覽器會顯示下列 JSON:

    {
        "consul": []
    }
    

設定 Orleans

若要將 Orleans 設定為使用 Consul 作為成員資格提供者,您的 silo 專案必須參考 Microsoft.Orleans.Clustering.Consul NuGet 套件。 完成後,您可以在 silo 的 Program.cs 檔案中設定成員資格提供者,如下所示:

IHostBuilder builder = Host.CreateDefaultBuilder(args)
    .UseOrleans(silo =>
    {
        silo.UseConsulSiloClustering(options =>
        {
            // The address of the Consul server
            var address = new Uri("http://localhost:8500");
            options.ConfigureConsulClient(address);
        });
    })
    .UseConsoleLifetime();

using IHost host = builder.Build();
host.Run();

上述程式代碼:

若要設定用戶端,請參考相同的 NuGet 套件,並呼叫 UseConsulClientClustering 擴充方法。

用戶端 SDK

如果您有興趣使用 Consul 進行服務探索,則大部分熱門語言 用戶端 SDK

實作詳細數據

成員資格數據表提供者會利用 Consul 的索引鍵/值存放區 的功能,搭配 Check-And-Set (CAS) 作業。 當每個 Silo 啟動時,它會註冊兩個鍵值項目,其中一個包含 Silo 的詳細數據,另一個會保存 Silo 最後報告其仍然運作的時間。 後者是指診斷「我活著」條目,而不是故障檢測脈衝,這些脈衝是直接在資料筒倉之間傳送的,並且不會寫入到標格中。 所有對數據表的寫入都會使用 CAS 來執行,以提供併發控制,因為 Orleans的 叢集管理通訊協定的需求。

當 Silo 運行後,您可以在網頁瀏覽器中檢視這些條目,網址為:http://localhost:8500/v1/kv/?keys&pretty,將會顯示如下內容:

[
    "orleans/default/192.168.1.11:11111@43165319",
    "orleans/default/192.168.1.11:11111@43165319/iamalive",
    "orleans/default/version"
]

所有密鑰前面都會加上 orleans,這是在提供者中硬式編碼,旨在避免與 Consul 的其他用戶發生密鑰空間衝突。 您可以使用其中任何一個鍵來檢索這些鍵的額外資訊,方法是將鍵名稱(不含引號)追加到 http://localhost:8500/v1/kv/的 Consul KV 根目錄。 這麼做會顯示下列 JSON:

[
    {
        "LockIndex": 0,
        "Key": "orleans/default/192.168.1.11:11111@43165319",
        "Flags": 0,
        "Value": "[BASE64 UTF8 Encoded String]",
        "CreateIndex": 321,
        "ModifyIndex": 322
    }
]

解碼 Base64 UTF-8 編碼的字串 Value 以獲得實際的 Orleans 成員資格數據。

http://localhost:8500/v1/KV/orleans/default/[SiloAddress]

{
    "Hostname": "[YOUR_MACHINE_NAME]",
    "ProxyPort": 30000,
    "StartTime": "2023-05-15T14:22:00.004977Z",
    "Status": 3,
    "SiloName": "Silo_fcad0",
    "SuspectingSilos": []
}

http://localhost:8500/v1/KV/orleans/default/[SiloAddress]/IAmAlive

"2023-05-15T14:27:01.1832828Z"

當用戶端連線時,他們會使用統一資源識別符 (URI) http://192.168.1.26:8500/v1/KV/orleans/default/?recurse,讀取叢集中所有資料儲存區的鍵值對。

局限性

使用 Consul 作為成員資格提供者時,有一些限制需要注意。

Orleans 擴充成員資格通訊協定 (資料表版本 & ETag)

Consul KV 目前不支援原子性更新。 因此,Orleans Consul Membership Provider 只會實作 Orleans 基本成員資格通訊協定,如 Orleans叢集管理中所述,且不支援擴充成員資格通訊協定。 此擴充協定作為非必要但額外的獨立系統聯機驗證被引入,同時也是尚未實現功能的基礎。

多個數據中心

Consul 中的索引鍵/值組目前不會在 Consul 數據中心之間複寫。 有 個別的專案 來解決此複製工作,但仍未證明能夠支援 Orleans。

在 Windows 上執行時

當 Consul 在 Windows 上啟動時,它會記錄下列訊息:

==> WARNING: Windows is not recommended as a Consul server. Do not use in production.

由於在 Windows 環境執行時測試不足,而非因為任何已知的實際問題,這是顯示此警告訊息的原因。 先閱讀 討論,再決定領事是否適合您。

潛在的未來增強功能

  1. 證明 Consul KV 複寫專案可以在多個 Consul 資料中心之間的 WAN 環境中支援 Orleans 叢集。
  2. 在 Consul 中實作提醒數據表。
  3. 實作擴充成員資格通訊協定。 Consul 背後的團隊計畫實施原子操作,一旦這項功能可以使用,就可以移除供應商的限制。