Använda Consul som medlemskapsprovider
Consul är en distribuerad, högtillgänglig och datacentermedveten tjänstidentifieringsplattform som innehåller enkel tjänstregistrering, hälsokontroll, felidentifiering och nyckelvärdeslagring. Den bygger på att varje nod i datacentret kör en konsulagent som antingen fungerar som en server eller klient. Varje agent kommunicerar via ett skalbart skvallerprotokoll.
Det finns en detaljerad översikt över Consul, inklusive jämförelser med liknande lösningar här.
Consul är skriven i Go och är öppen källkod; kompilerade nedladdningar är tillgängliga för macOS X, FreeBSD, Linux, Solaris och Windows.
Varför välja konsul?
Som Orleans medlemskapsleverantörär Consul ett bra val när du behöver leverera en lokal lösning som inte kräver att dina potentiella kunder har någon befintlig infrastruktur eller en samarbetsvillig IT-leverantör. Consul är en enkel körbar fil, har inga beroenden och kan därför enkelt byggas in i mellanprogramslösningen. När Consul är din lösning för att upptäcka, kontrollera och underhålla dina mikrotjänster är det klokt att integrera helt med Orleans medlemskap för enkelhetens skull och enkel användning. Det finns också en medlemskapstabell i Consul (även känd som "Orleans Custom System Store"), som helt integreras med Orleans:s klusterhantering.
Konfigurera Consul
Det finns omfattande dokumentation om Consul.io angående hur man konfigurerar ett stabilt Consul-kluster, och det är inte meningsfullt att upprepa det i det här sammanhanget. Men för din bekvämlighet inkluderar vi den här guiden så att du snabbt kan komma igång med Orleans med en fristående Consul-agent.
Skapa en mapp för att installera Consul i (till exempel C:\Consul).
Skapa en undermapp: C:\Consul\Data (Consul skapar inte den här katalogen om den inte finns).
Ladda ned och packa upp Consul.exe till C:\Consul.
Öppna en kommandotolk på C:\Consul och kör följande kommando:
./consul.exe agent -server -bootstrap -data-dir "C:\Consul\Data" -client='0.0.0.0'
I föregående kommando:
-
agent
: Instruerar Consul att köra agentprocessen som värdar tjänsterna. Utan denna inställning försöker konsulprocessen använda RPC för att konfigurera en redan körande agent. -
-server
: Definierar agenten som en server och inte en klient (en konsul klient är en agent som är värd för alla tjänster och data, men som inte har rösträtt för att bestämma och inte kan bli klusterledare. -
-bootstrap
: Den första (och endast den första!) noden i ett kluster måste bootstrappas så att den antar klusterledarskapet. -
-data-dir [path]
: Anger sökvägen där alla konsuldata lagras, inklusive tabellen för klustermedlemskap. -
-client='0.0.0.0'
: Informerar konsuln om vilken IP-adress som tjänsten ska öppnas på.
Det finns många andra parametrar och alternativet att använda en JSON-konfigurationsfil. En fullständig lista över alternativen finns i konsuldokumentationen.
-
Kontrollera att Consul körs och är redo att ta emot medlemskapsförfrågningar från Orleans genom att öppna tjänstens slutpunkt i webbläsaren på
http://localhost:8500/v1/catalog/services
. När den fungerar korrekt visar webbläsaren följande JSON:{ "consul": [] }
Konfigurera Orleans
För att konfigurera Orleans att använda Consul som medlemskapsprovider måste ditt siloprojekt referera till Microsoft.Orleans. Clustering.Consul NuGet-paket. När du har gjort det kan du konfigurera medlemskapsprovidern i din silos Program.cs-fil på följande sätt:
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();
Föregående kod:
- Skapar en IHostBuilder med standardvärden från Host.CreateDefaultBuilder().
- Kedjar ett anrop till UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) som konfigurerar Orleans silo.
- Givet att ISiloBuilder ringer UseConsulSiloClustering.
- Konfigurerar klustermedlemskapsprovidern att använda Consul, givet Consul
address
.
Om du vill konfigurera klienten refererar du till samma NuGet-paket och anropar UseConsulClientClustering-tilläggsmetoden.
Klient-SDK
Om du är intresserad av att använda Consul för din tjänstidentifiering finns det klient-SDK:er för de mest populära språken.
Implementeringsinformation
Medlemskapstabellprovidern använder Consuls nyckel-/värdearkiv funktioner med CAS-åtgärder (Check-And-Set). När varje Silo startar registreras två nyckel/värde-poster, en som innehåller Silo-detaljerna och en som anger tidpunkten den senaste gången Silo rapporterade att den var aktiv. Det senare refererar till diagnostikposterna "I'm alive" och inte till pulsslag för felidentifiering, som skickas direkt mellan silorna och inte skrivs till tabellen. Alla skrivningar till tabellen utförs med CAS för att tillhandahålla samtidighetskontroll, vilket krävs av OrleansCluster Management Protocol.
När Silon är igång kan du visa dessa poster i webbläsaren på http://localhost:8500/v1/kv/?keys&pretty
, som ser ut ungefär så här:
[
"orleans/default/192.168.1.11:11111@43165319",
"orleans/default/192.168.1.11:11111@43165319/iamalive",
"orleans/default/version"
]
Alla nycklar är prefixade med orleans
, vilket är hårdkodade i leverantören och avsedd att undvika nyckelutrymmeskollision med andra användare av Consul. Du kan använda någon av dessa nycklar för att hämta ytterligare information. Var och en av dessa nycklar kan läsas genom att lägga till deras nyckelnamn (utan citattecken) till Consul KV-roten på http://localhost:8500/v1/kv/
. När du gör det får du följande JSON:
[
{
"LockIndex": 0,
"Key": "orleans/default/192.168.1.11:11111@43165319",
"Flags": 0,
"Value": "[BASE64 UTF8 Encoded String]",
"CreateIndex": 321,
"ModifyIndex": 322
}
]
Om du avkodar den Base64 UTF-8-kodade strängen Value
får du de faktiska Orleans medlemskapsdata:
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"
När klienterna ansluter läser de KV:erna för alla silor i klustret i en HTTP GET med hjälp av URI-http://192.168.1.26:8500/v1/KV/orleans/default/?recurse
.
Begränsningar
Det finns några begränsningar att vara medveten om när du använder Consul som medlemskapsprovider.
Orleans utökat medlemskapsprotokoll (tabellversion & ETag)
Konsul KV stöder för närvarande inte atomiska uppdateringar. Därför implementerar Orleans Consul-medlemskapsprovidern endast det Orleans grundläggande medlemskapsprotokollet, enligt beskrivningen i Klusterhantering i Orleansoch stöder inte det utökade medlemskapsprotokollet. Det här utökade protokollet introducerades som en extra, men inte nödvändig, siloanslutningsverifiering och som en grund för funktioner som ännu inte har implementerats.
Flera datacenter
Nyckel/värde-paren i Consul replikeras för närvarande inte mellan Consul-datacenter. Det finns ett separat projekt för att hantera den här replikeringsinsatsen, men det har ännu inte visat sig stödja Orleans.
När du kör i Windows
När konsuln startar i Windows loggar den följande meddelande:
==> WARNING: Windows is not recommended as a Consul server. Do not use in production.
Det här varningsmeddelandet visas på grund av bristande fokus på testning när du kör i en Windows-miljö och inte på grund av några faktiska kända problem. Läs diskussion innan du bestämmer dig för om konsul är rätt val för dig.
Potentiella framtida förbättringar
- Bevisa att Consul KV-replikeringsprojektet kan stödja ett Orleans-kluster i en WAN-miljö mellan flera Consul-datacenter.
- Implementera påminnelsetabellen i Consul.
- Implementera protokollet för utökat medlemskap. Teamet bakom Consul planerar att implementera atomiska operationer, när den här funktionen är tillgänglig är det möjligt att ta bort begränsningarna hos leverantören.