Verwenden von Consul als Mitgliedschaftsanbieter

Consul ist eine verteilte, hochverfügbare und rechenzentrumsfähige Dienstermittlungsplattform, die eine einfache Dienstregistrierung, Integritätsprüfung, Fehlererkennung und Schlüssel-Wert-Speicherung umfasst. Sie setzt voraus, dass auf jedem Knoten im Rechenzentrum ein Consul-Agent ausgeführt wird, der entweder als Server oder als Client fungiert. Jeder Agent kommuniziert über ein skalierbares Gossip-Protokoll.

Eine sehr detaillierte Übersicht über Consul einschließlich Vergleichen mit ähnlichen Lösungen finden Sie hier.

Consul ist in Go geschrieben und Open Source. Kompilierte Downloads sind für macOS, FreeBSD, Linux, Solaris und Windows verfügbar.

Gründe für Konsul

Als Orleans-Mitgliedschaftsanbieter ist Consul eine gute Wahl, wenn Sie eine lokale Lösung bereitstellen müssen, für die Ihre potenziellen Kund*innen keine vorhandene Infrastruktur und keinen kooperativen IT-Anbieter benötigen. Consul ist eine einzelne schlanke ausführbare Datei, die keine Abhängigkeiten aufweist und daher problemlos in Ihre Middlewarelösung integriert werden kann. Wenn Consul Ihre Lösung zum Ermitteln, Prüfen und Warten Ihrer Microservices ist, bietet sich eine vollständige Integration in die Orleans-Mitgliedschaft an, um Einfachheit und unkomplizierten Betrieb zu gewährleisten. Es gibt in Consul eine Mitgliedschaftstabelle (auch als „Benutzerdefinierter Systemspeicher von Orleans“ bezeichnet), die vollständig in die Clusterverwaltung von Orleans integriert ist.

Einrichten von Consul

Es gibt eine umfangreiche Dokumentation zu Consul.io zum Einrichten eines stabilen Consul-Clusters, und es ist nicht sinnvoll, die Schritte hier zu wiederholen. Damit Sie jedoch Orleans schnell mit einem eigenständigen Consul-Agent in Betrieb nehmen können, haben wir diese Anleitung für Sie erstellt.

  1. Erstellen Sie einen Ordner, in dem Consul installiert werden soll (z. B. C:\Consul).

  2. Erstellen Sie den Unterordner C:\Consul\Data (Consul erstellt dieses Verzeichnis nicht, wenn es nicht vorhanden ist).

  3. Sie können nun Consul.exe in C:\Consul zunächst herunterladen und dann entpacken.

  4. Öffnen Sie unter C:\Consul eine Eingabeaufforderung, und führen Sie den folgenden Befehl aus:

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

    Für den obigen Befehl gilt Folgendes:

    • agent weist Consul an, den Agent-Prozess auszuführen, der die Dienste hostet. Ohne diesen Schalter versucht der Consul-Prozess, RPC zum Konfigurieren eines ausgeführten Agent zu verwenden.
    • -server definiert den Agent als Server und nicht als Client. (Ein Consul-Client ist ein Agent, der alle Dienste und Daten hostet, aber kein Stimmrecht für Entscheidungen hat und auch keine Führungsrolle im Cluster übernehmen kann.)
    • -bootstrap: Für den ersten (und nur den ersten!) Knoten in einem Cluster muss ein Bootstrapping erfolgen, damit er die Führungsrolle im Cluster übernimmt.
    • -data-dir [path] gibt den Pfad an, in dem alle Consul-Daten gespeichert werden, einschließlich der Clustermitgliedschaftstabelle.
    • -client='0.0.0.0' informiert Consul, an welcher IP-Adresse der Dienst geöffnet werden soll.

    Es gibt viele weitere Parameter und die Option, eine JSON-Konfigurationsdatei zu verwenden. Eine vollständige Liste der Optionen finden Sie in der Consul-Dokumentation.

  5. Vergewissern Sie sich, dass Consul ausgeführt wird und bereit ist, Mitgliedschaftsanforderungen von Orleans anzunehmen, indem Sie unter http://localhost:8500/v1/catalog/services den Dienstendpunkt in Ihrem Browser öffnen. Bei ordnungsgemäßem Betrieb zeigt der Browser den folgenden JSON-Code an:

    {
        "consul": []
    }
    

Konfigurieren von Orleans

Um die Verwendung von Consul als Mitgliedschaftsanbieter durch Orleans zu konfigurieren, muss Ihr Siloprojekt auf das NuGet-Paket Microsoft.Orleans.Clustering.Consul verweisen. Anschließend können Sie den Mitgliedschaftsanbieter in der Datei Program.cs Ihres Silos wie folgt konfigurieren:

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();

Der vorangehende Code:

Um den Client zu konfigurieren, verweisen Sie auf dasselbe NuGet-Paket und rufen die UseConsulClientClustering-Erweiterungsmethode auf.

Client-SDK

Wenn Sie Consul für die Ermittlung Ihrer Dienste verwenden möchten, gibt es für die meisten gängigen Sprachen Client-SDKs.

Implementierungsdetails

Der Mitgliedschaftstabellenanbieter nutzt die Schlüssel-Wert-Speicherfunktion von Consul mit Check-And-Set-Vorgängen (CAS). Beim Start der einzelnen Silos registriert er zwei Schlüssel-Wert-Einträge: einen mit Details zum Silo und einen mit dem Zeitpunkt, zu dem das Silo zuletzt gemeldet hat, dass es aktiv war. Letzteres bezieht sich auf Diagnoseeinträge zur Aktivität und nicht auf Heartbeats zur Fehlererkennung, die direkt zwischen den Silos gesendet und nicht in die Tabelle geschrieben werden. Alle Schreibvorgänge in die Tabelle erfolgen mithilfe von CAS, um Parallelitätssteuerung zu ermöglichen, wie dies vom Clusterverwaltungsprotokoll von Orleans verlangt wird.

Sobald das Silo ausgeführt wird, können Sie diese Einträge in Ihrem Webbrowser unter http://localhost:8500/v1/kv/?keys&pretty anzeigen, wo Folgendes angezeigt wird:

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

Allen Schlüsseln wird das Präfix orleans vorangestellt, das im Anbieter hartcodiert ist und zur Vermeidung von Keyspacekonflikten mit anderen Benutzer*innen von Consul dient. Sie können einen dieser Schlüssel verwenden, um zusätzliche Informationen abzurufen. Jeder dieser Schlüssel kann gelesen werden, indem Sie den Schlüsselnamen (ohne Anführungszeichen) an den Consul KV-Stamm unter http://localhost:8500/v1/kv/ anfügen. Anschließend wird folgender JSON-Code gezeigt:

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

Durch das Decodieren der Base64-Zeichenfolge Value in UTF-8-Codierung erhalten Sie Daten zur aktuellen Orleans-Mitgliedschaft:

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"

Wenn die Clients eine Verbindung herstellen, lesen sie in einem HTTP GET-Vorgang unter Verwendung des URI http://192.168.1.26:8500/v1/KV/orleans/default/?recurse die KV-Instanzen aller Silos im Cluster.

Einschränkungen

Es sind einige Einschränkungen zu beachten, wenn Sie Consul als Mitgliedschaftsanbieter verwenden.

Erweitertes Mitgliedschaftsprotokoll von Orleans (Tabellenversion und Entitätstag)

Consul KV unterstützt derzeit keine atomischen Updates. Daher implementiert der Consul-Mitgliedschaftsanbieter für Orleans nur das einfache Mitgliedschaftsprotokoll von Orleans, wie unter Clusterverwaltung in Orleans beschrieben, und er unterstützt nicht das erweiterte Mitgliedschaftsprotokoll. Dieses erweiterte Protokoll wurde als zusätzliche, aber nicht unbedingt erforderliche Überprüfung der Silokonnektivität und als Grundlage für Funktionalität eingeführt, die noch nicht implementiert wurde.

Mehrere Rechenzentren

Die Schlüssel-Wert-Paare in Consul werden derzeit nicht zwischen Consul-Rechenzentren repliziert. Es gibt ein separates Projekt, um diese Replikation zu ermöglichen, aber die Unterstützung für Orleans wurde noch nicht nachgewiesen.

Bei Ausführung unter Windows

Beim Start von Consul unter Windows wird die folgende Meldung protokolliert:

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

Diese Warnung ist auf die fehlende Konzentration auf Tests in einer Windows-Umgebung zurückzuführen und nicht auf bekannte Probleme. Lesen Sie die Diskussion, ehe Sie entscheiden, ob Consul die richtige Wahl für Sie ist.

Mögliche künftige Verbesserungen

  1. Beweisen, dass das Consul KV-Replikationsprojekt einen Orleans-Cluster in einer WAN-Umgebung zwischen mehreren Consul-Rechenzentren unterstützen kann
  2. Implementieren der Erinnerungstabelle in Consul.
  3. Implementieren des erweiterten Mitgliedschaftsprotokolls. Das Consul-Team plant die Implementierung atomischer Vorgänge. Sobald diese Funktionalität verfügbar ist, wird es möglich sein, die Einschränkungen im Anbieter zu überwinden.