Usare Consul come provider di appartenenze
Consul è una piattaforma di individuazione dei servizi distribuita, a disponibilità elevata e compatibile con il data center che include la registrazione semplice del servizio, il controllo dell'integrità, il rilevamento degli errori e l'archiviazione chiave-valore. Si basa sul presupposto che ogni nodo del data center esegua un agente Consul che funge da server o client. Ogni agente comunica tramite un protocollo gossip scalabile.
Qui è disponibile una panoramica dettagliata di Consul, inclusi i confronti con soluzioni simili.
Consul è scritto in Go ed è open source; i download compilati sono disponibili per macOS X, FreeBSD, Linux, Solaris e Windows
Perché scegliere Consul?
Come OrleansProvider di appartenenze, Consul è una scelta ottimale quando è necessario offrire una soluzione locale che non richiede ai potenziali clienti di avere un'infrastruttura esistente e un provider IT cooperativo. Consul è un singolo eseguibile leggero, non ha dipendenze e, di conseguenza, può essere facilmente integrato nella soluzione middleware. Quando Consul è la soluzione per individuare, controllare e gestire i microservizi, è opportuno integrarsi completamente con l’appartenenza Orleans per semplicità e facilità di funzionamento. Esiste anche una tabella di appartenenza in Consul (nota anche come "Orleans Archivio di sistema personalizzato"), che si integra completamente con la Gestione cluster di Orleans.
Configurare Consul
È disponibile una documentazione completa su Consul.io sulla configurazione di un cluster Consul stabile e non ha senso ripeterlo qui. Tuttavia, per praticità, includiamo questa guida in modo da poter eseguire rapidamente Orleans con un agente Consul autonomo.
Creare una cartella in cui installare Consul, ad esempio C:\Consul.
Creare una sottocartella: C:\Consul\Data (Consul non crea questa directory se non esiste).
Scaricare e decomprimere Consul.exe in C:\Consul.
Aprire un prompt dei comandi in C:\Consul ed eseguire il comando seguente:
./consul.exe agent -server -bootstrap -data-dir "C:\Consul\Data" -client='0.0.0.0'
Nel comando precedente:
agent
: indica a Consul di eseguire il processo dell'agente che ospita i servizi. Senza questa opzione, il processo Consul tenta di usare RPC per configurare un agente in esecuzione.-server
: definisce l'agente come server e non come client (un client Consul è un agente che ospita tutti i servizi e i dati, ma non dispone dei diritti di voto per decidere, e non può diventare, il leader del cluster.-bootstrap
: il primo nodo (e solo il primo) in un cluster deve essere riavviato in modo che presupporrà la leadership del cluster.-data-dir [path]
: specifica il percorso in cui vengono archiviati tutti i dati di Consul, inclusa la tabella di appartenenza al cluster.-client='0.0.0.0'
: indica a Consul l'indirizzo IP in cui aprire il servizio.
Esistono molti altri parametri e l'opzione per usare un file di configurazione JSON. Per un elenco completo delle opzioni, vedere la documentazione di Consul.
Verificare che Consul sia in esecuzione e pronto per accettare le richieste di appartenenza da Orleans aprendo l'endpoint dei servizi nel browser in
http://localhost:8500/v1/catalog/services
. Quando funziona correttamente, il browser visualizza il codice JSON seguente:{ "consul": [] }
ConfigurareOrleans
Per configurare Orleans per l'uso di Consul come provider di appartenenze, il progetto silo dovrà fare riferimento al pacchetto NuGet Microsoft.Orleans.Clustering.Consul. Al termine, è possibile configurare il provider di appartenenze nel file Program.cs del silo come indicato di seguito:
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();
Il codice precedente:
- Crea un oggetto IHostBuilder con valori predefiniti dall’oggetto Host.CreateDefaultBuilder().
- Concatena una chiamata a UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) che configura il silo Orleans.
- Data la chiamata di ISiloBuilder a UseConsulSiloClustering.
- Configura il provider di appartenenze al cluster per l'uso di Consul, in base al
address
Consul.
Per configurare il client, fare riferimento allo stesso pacchetto NuGet e chiamare il metodo di estensione UseConsulClientClustering.
SDK client
Se si è interessati all'uso di Consul per l'individuazione dei servizi, sono disponibili SDK client per le lingue più diffuse.
Dettagli dell’implementazione
Il provider di tabelle di appartenenza usa la funzionalità archivio chiavi/valore di Consul con operazioni Check-And-Set (CAS). All'avvio di ogni Silo, registra due voci chiave-valore, una che contiene i dettagli del silo e una che contiene l'ultima volta che il Silo ha segnalato di essere attivo. Quest'ultimo si riferisce alle voci di diagnostica "I'm alive" e non agli heartbeat di rilevamento degli errori, che vengono inviati direttamente tra i silo e non vengono scritti nella tabella. Tutte le scritture nella tabella vengono eseguite con CAS per fornire il controllo della concorrenza, come richiesto dal Orleansprotocollo di gestione cluster di .
Quando il Silo è in esecuzione, è possibile visualizzare queste voci nel Web browser in http://localhost:8500/v1/kv/?keys&pretty
, che visualizza qualcosa di simile a quanto segue:
[
"orleans/default/192.168.1.11:11111@43165319",
"orleans/default/192.168.1.11:11111@43165319/iamalive",
"orleans/default/version"
]
Tutte le chiavi sono precedute da orleans
, che è hardcoded nel provider ed è progettato per evitare conflitti di spazio chiave con altri utenti di Consul. È possibile usare una di queste chiavi per recuperare informazioni aggiuntive su Ognuna di queste chiavi può essere letta aggiungendo il nome della chiave (senza virgolette) alla radice KV consul in http://localhost:8500/v1/kv/
. In questo modo viene visualizzato il codice JSON seguente:
[
{
"LockIndex": 0,
"Key": "orleans/default/192.168.1.11:11111@43165319",
"Flags": 0,
"Value": "[BASE64 UTF8 Encoded String]",
"CreateIndex": 321,
"ModifyIndex": 322
}
]
La decodifica della stringa con codifica UTF-8 Base64 Value
fornisce i dati effettivi di appartenenza a 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"
Quando i client si connettono, leggono le KV per tutti i silo nel cluster in un unico HTTP GET usando l'URI http://192.168.1.26:8500/v1/KV/orleans/default/?recurse
.
Limiti
Esistono alcune limitazioni da tenere presenti quando si usa Consul come provider di appartenenze.
Orleans protocollo di appartenenza estesa (versione tabella & ETag)
La versione KV di Consul attualmente non supporta gli aggiornamenti atomici. Pertanto, il provider di appartenenze Consul Orleans implementa solo il protocollo di appartenenza di base Orleans, come descritto in Gestione cluster in Orleans e non supporta il protocollo di appartenenza estesa. Questo protocollo esteso è stato introdotto come ulteriore, ma non essenziale, convalida della connettività silo e come base per le funzionalità che non sono ancora state implementate.
Più data center
Le coppie chiave-valore in Consul non vengono attualmente replicate tra data center Consul. Esiste un progetto separato per soddisfare questo impegno di replica, ma non è stato ancora dimostrato di supportare Orleans.
Durante l'esecuzione in Windows
All'avvio di Consul in Windows, registra il messaggio seguente:
==> WARNING: Windows is not recommended as a Consul server. Do not use in production.
Questo messaggio di avviso viene visualizzato a causa della mancanza di attenzione sui test durante l'esecuzione in un ambiente Windows e non a causa di problemi noti effettivi. Leggere la discussione prima di decidere se Consul è la scelta giusta per voi.
Potenziali miglioramenti futuri
- Dimostrare che il progetto di replica KV Consul può supportare un cluster Orleans in un ambiente WAN tra più data center Consul.
- Implementare la tabella promemoria in Consul.
- Implementare il protocollo di appartenenza estesa. Il team responsabile di Consul prevede di implementare operazioni atomiche; una volta che questa funzionalità è disponibile, è possibile rimuovere le limitazioni nel provider.