Use o Consul como um provedor de associação
Consul é uma plataforma de descoberta de serviços distribuída, altamente disponível e com reconhecimento de data center que inclui registro de serviço simples, verificação de integridade, deteção de falhas e armazenamento de chave-valor. Isto é construído com base na premissa de que cada nó no datacenter está a executar um agente Consul que atua como servidor ou cliente. Cada agente se comunica através de um protocolo de fofoca escalável.
Há uma visão geral detalhada do Consul, incluindo comparações com soluções semelhantes aqui.
Consul está escrito em Go e é de código aberto; downloads compilados estão disponíveis para macOS X, FreeBSD, Linux, Solaris e Windows.
Porquê escolher a Consul?
Como Provedor de Associação Orleans, a Consul é uma boa escolha quando necessitar fornecer uma solução no local que não exija que os seus clientes potenciais tenham infraestrutura existente e um fornecedor de TI cooperativo. O Consul é um executável único leve, não tem dependências e, como tal, pode ser facilmente incorporado na sua solução de middleware. Quando o Consul é a sua solução para descobrir, verificar e manter os seus microsserviços, faz sentido integrar-se totalmente com a Orleans associação para simplicidade e facilidade de operação. Também existe uma tabela de adesão no Consul (também conhecida como "Orleans Custom System Store"), que se integra totalmente com a Gestão de Clusters Orleans.
Configurar o Consul
Há uma extensa documentação disponível sobre Consul.io sobre a criação de um cluster estável do Consul, e não faz sentido repetir isso aqui. No entanto, para sua conveniência, incluímos este guia para que você possa rapidamente começar Orleans funcionando com um agente Consul independente.
Crie uma pasta para instalar o Consul (por exemplo, C:\Consul).
Crie uma subpasta: C:\Consul\Data (o Consul não cria este diretório se ele não existir).
Baixe e descompacte Consul.exe no C:\Consul.
Abra um prompt de comando em C:\Consul e execute o seguinte comando:
./consul.exe agent -server -bootstrap -data-dir "C:\Consul\Data" -client='0.0.0.0'
No comando anterior:
-
agent
: Instrui o Cônsul a executar o processo de agente que hospeda os serviços. Sem essa opção, o processo Consul tenta usar RPC para configurar um agente em execução. -
-server
: Define o agente como um servidor e não como um cliente (Um cliente Consul é um agente que hospeda todos os serviços e dados, mas não tem direitos de voto para decidir, e não pode se tornar, o líder do cluster. -
-bootstrap
: O primeiro (e apenas o primeiro!) nó em um cluster deve ser inicializado para que ele assuma a liderança do cluster. -
-data-dir [path]
: Especifica o caminho onde todos os dados do Consul são armazenados, incluindo a tabela de associação do cluster. -
-client='0.0.0.0'
: Informa o Consul sobre em que IP abrir o serviço.
Há muitos outros parâmetros e a opção de usar um arquivo de configuração JSON. Para obter uma lista completa das opções, consulte a documentação do Consul.
-
Verifique se o Consul está em execução e pronto para aceitar solicitações de associação do Orleans abrindo o ponto de extremidade de serviços em seu navegador em
http://localhost:8500/v1/catalog/services
. Quando funciona corretamente, o navegador exibe o seguinte JSON:{ "consul": [] }
Configurar Orleans
Para configurar Orleans para usar o Consul como um provedor de associação, seu projeto de silo precisará fazer referência ao Microsoft.Orleans. Clustering.Consul pacote NuGet. Depois de fazer isso, você pode configurar o provedor de associação no arquivo de Program.cs do seu silo da seguinte maneira:
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();
O código anterior:
- Cria um IHostBuilder com padrões do Host.CreateDefaultBuilder().
- Encadeia uma chamada para o UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) que configura o silo Orleans.
- Dado que o ISiloBuilder chama UseConsulSiloClustering.
- Configura o provedor de associação do cluster para utilizar o Consul, dado o Consul
address
.
Para configurar o cliente, faça referência ao mesmo pacote NuGet e chame o método de extensão UseConsulClientClustering.
SDK do cliente
Se você estiver interessado em usar o Consul para sua descoberta de serviços, há SDKs de cliente para os idiomas mais populares.
Detalhes da implementação
O Provedor de Tabela de Membros faz uso da funcionalidade de armazenamento de chaves/valores do Consul com operações deAnd-Set de verificação (CAS). Quando cada Silo começa, regista duas entradas de chave-valor, uma que contém os detalhes do Silo e outra que contém a última vez em que o Silo confirmou estar ativo. Este último refere-se a entradas de diagnóstico "Estou vivo" e não a batimentos cardíacos de deteção de falha, que são enviados diretamente entre os silos e não são escritos na tabela. Todas as operações de gravação na tabela são realizadas com CAS para fornecer controle de simultaneidade, conforme exigido pelo Cluster Management Protocol do Orleans.
Quando o Silo estiver em execução, você poderá visualizar essas entradas no seu navegador da Web em http://localhost:8500/v1/kv/?keys&pretty
, que exibe algo como:
[
"orleans/default/192.168.1.11:11111@43165319",
"orleans/default/192.168.1.11:11111@43165319/iamalive",
"orleans/default/version"
]
Todas as chaves são prefixadas com orleans
, que é codificado no provedor e destina-se a evitar a colisão do espaço de chaves com outros usuários do Consul. Você pode usar qualquer uma dessas chaves para recuperar informações adicionais sobre Cada uma dessas chaves pode ser lida anexando seu nome de chave (sem aspas) à raiz KV do Consul em http://localhost:8500/v1/kv/
. Ao fazê-lo, terá o seguinte JSON:
[
{
"LockIndex": 0,
"Key": "orleans/default/192.168.1.11:11111@43165319",
"Flags": 0,
"Value": "[BASE64 UTF8 Encoded String]",
"CreateIndex": 321,
"ModifyIndex": 322
}
]
A decodificação da cadeia de caracteres codificada Base64 UTF-8 Value
fornece os dados reais da associação 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 os clientes se conectam, eles leem os KVs de todos os silos no cluster em um HTTP GET usando o URI http://192.168.1.26:8500/v1/KV/orleans/default/?recurse
.
Limitações
Existem algumas limitações a ter em conta ao utilizar o Consul como fornecedor de membros.
Orleans protocolo de associação estendida (versão de tabela & ETag)
Atualmente, o Consul KV não suporta atualizações atômicas. Portanto, o Orleans Consul Membership Provider implementa apenas o Orleans protocolo de associação básico, conforme descrito em gerenciamento de cluster no Orleanse não suporta o protocolo de associação estendida. Este protocolo estendido foi introduzido como uma base para funcionalidades que ainda não foram implementadas, além de servir como uma validação extra, mas não essencial, de conectividade de silo.
Vários datacenters
Atualmente, os pares chave-valor no Consul não são replicados entre os data centers do Consul. Há um projeto separado para lidar com esse esforço de replicação, mas ainda não foi comprovado que ele ofereça suporte a Orleans.
Ao executar no Windows
Quando o Consul é iniciado no Windows, ele registra a seguinte mensagem:
==> WARNING: Windows is not recommended as a Consul server. Do not use in production.
Esta mensagem de aviso é exibida devido à falta de foco no teste ao executar em um ambiente Windows e não devido a quaisquer problemas conhecidos reais. Leia a discussão dos antes de decidir se o Consul é a escolha certa para si.
Potenciais melhorias futuras
- Comprove que o projeto de replicação do Consul KV pode suportar um cluster de Orleans em um ambiente WAN entre vários data centers Consul.
- Implemente a Tabela de Lembretes no Consul.
- Implemente o Protocolo de Associação Estendida. A equipe por trás do Consul planeja implementar operações atômicas, uma vez que essa funcionalidade esteja disponível, é possível remover as limitações no provedor.