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

Consul 是分散式、高可用性和資料中心感知服務探索平台,其中包含簡單的服務註冊、健康情況檢查、失敗偵測,以及索引鍵/值儲存體。 它是以資料中心的每個節點都執行 Consul 代理程式作為伺服器或用戶端的前提為建置基礎。 每個代理程式都會透過可調整的 Gossip 通訊協定通訊。

Consul 有詳細的概觀,包括與此處類似解決方案的比較。

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

為什麼要選擇 Consul?

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

設定 Consul

關於設定穩定 Consul 叢集有針對 Consul.io 的廣泛文件,因此不需要在此重複說明。 不過,為了方便起見,我們會包含本指南,讓您能夠快速使用獨立 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':通知 Consul 要開啟服務的 IP。

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

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

    {
        "consul": []
    }
    

設定 Orleans

若要設定 Orleans 以使用 Consul 作為成員資格提供者,您的定址接收器專案必須參考 Microsoft.Orleans.Clustering.Consul NuGet 套件。 完成後,您可以在定址接收器的 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) 作業。 當每個定址接收器啟動時,它會註冊兩個索引鍵/值項目,其中一個包含定址接收器詳細資料,而另一個項目會保有最後一次「定址接收器」回報其運作中的時間。 後者是指診斷「我運作中」項目,而非失敗後偵測活動訊號,其會直接在定址接收器之間傳送,且不會寫入資料表中。 所有對資料表的寫入都會使用 CAS 來執行,以提供並行存取控制,因為這是 Orleans 的叢集管理通訊協定所需要的。

一旦定址接收器執行之後,您就可以在網頁瀏覽器中的 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 的其他使用者發生 keyspace 衝突。 您可以使用其中任何一個金鑰來擷取其他資訊。這些金鑰可以透過將金鑰名稱 (不含引號) 附加至位於 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 以一次 HTTP GET 來讀取叢集中所有定址接收器的 KV。

限制

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

Orleans 延伸成員資格通訊協定 (資料表版本與實體標記)

Consul KV 目前不支援不可部分完成的更新。 因此,Orleans Consul 成員資格提供者只會實作 Orleans 基本成員資格通訊協定,如 Orleans 中的叢集管理中所述,且不支援延伸成員資格通訊協定。 此延伸通訊協定已引進為額外通訊協定,但並非必要的,如定址接收器連線驗證,以及作為尚未實作功能的基礎。

多個資料中心

Consul 中的索引鍵/值組目前不會在 Consul 資料中心之間複寫。 有一個不同的項目可處理此複寫工作,但尚未證明支援 Orleans。

在 Windows 上執行時

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

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

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

潛在的未來增強功能

  1. 證明 Consul KV 複寫專案可以在多個 Consul 資料中心之間的 WAN 環境中支援 Orleans 叢集。
  2. 在 Consul 中實作提醒資料表。
  3. 實作擴充成員資格通訊協定。 Consul 背後的小組會規劃實作不可部分完成的作業,一旦這項功能可供使用,就可以移除提供者中的限制。