Usar o Consul como provedor de associação

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, detecção de falhas e armazenamento de chaves/valores. Ele é criado com base na premissa de que cada nó no data center executa um agente do Consul, que atua como servidor ou cliente. Cada agente se comunica por meio de um protocolo de fofoca escalonável.

Há uma visão geral detalhada do Consul, incluindo comparações com soluções semelhantes aqui.

O Consul é gravado no Go e é software livre. Os downloads compilados estão disponíveis para macOS X, FreeBSD, Linux, Solaris e Windows

Motivos para escolher o Consul.

Como Provedor de associação do Orleans, o Consul é uma boa opção quando você precisa fornecer uma solução local que não exija que os possíveis clientes tenham uma infraestrutura existente e um provedor de TI cooperativo. O Consul é um executável simples leve, não tem dependências e, como tal, pode ser facilmente incorporado à solução de middleware. Quando o Consul é a solução de descoberta, verificação e manutenção dos microsserviços, faz sentido integrar-se totalmente à associação do Orleans para simplificar e facilitar a operação. Também existe uma tabela de associação no Consul (também conhecido como "Repositório de Sistemas Personalizados do Orleans"), a qual é totalmente integrada ao Gerenciamento de Clusters do Orleans.

Configurar o Consul

Há uma documentação abrangente disponível em Consul.io sobre como configurar um cluster estável do Consul e não faz sentido repetir essas informações aqui. No entanto, para sua comodidade, incluímos este guia para que você possa executar o Orleans rapidamente com um agente autônomo do Consul.

  1. Crie uma pasta na qual instalar o Consul (por exemplo, C:\Consul).

  2. Crie uma subpasta: C:\Consul\Data (o Consul não cria esse diretório, se ele não existir).

  3. Baixe e descompacte o Consul.exe em C:\Consul.

  4. 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 Consul a executar o processo do agente que hospeda os serviços. Sem essa mudança, o processo do Consul tenta usar o RPC para configurar um agente em execução.
    • -server: define o agente como servidor e não como cliente (um cliente do 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 nó (e somente o primeiro!) em um cluster deve ser inicializado para que assuma a liderança do cluster.
    • -data-dir [path]: especifica o caminho em que todos os dados do Consul são armazenados, incluindo a tabela de associação do cluster.
    • -client='0.0.0.0': informa ao Consul em qual IP o serviço deve ser aberto.

    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, confira a documentação do Consul.

  5. Verifique se o Consul está em execução e pronto para aceitar as solicitações de associação do Orleans, abrindo o ponto de extremidade de serviços no navegador em http://localhost:8500/v1/catalog/services. Ao funcionar corretamente, o navegador exibe o seguinte JSON:

    {
        "consul": []
    }
    

configurar Orleans

Para configurar o Orleans para usar o Consul como um provedor de associação, seu projeto de silo precisará referenciar o pacote Microsoft.Orleans.Clustering.Consul NuGet . Depois de fazer isso, você pode configurar o provedor de associação no arquivo Program.cs do 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:

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 a descoberta de serviços, há SDKs do cliente para os idiomas mais populares.

Detalhes da implementação

O Provedor de Tabelas de Associação usa a funcionalidade de repositório de Chaves/Valores do Consul com as operações de CAS (Check-And-Set). Quando cada Silo é iniciado, ele registra duas entradas chave-valor, uma que contém os detalhes do Silo e outra que contém a última vez que o Silo relatou que estava ativo. Este último refere-se a diagnóstico de entradas "Estou ativo" e não a pulsações de detecção de falha, que são enviadas diretamente entre os silos e não são gravadas na tabela. Todas as gravações na tabela são executadas com o CAS para fornecer controle de simultaneidade, conforme exigido pelo Protocolo de Gerenciamento de Clusters do Orleans.

Depois que o Silo estiver em execução, você poderá exibir essas entradas no navegador da Web em http://localhost:8500/v1/kv/?keys&pretty, cuja exibição será assim:

[
    "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 é embutido em código no provedor e destina-se a evitar a colisão de keyspace com outros usuários do Consul. Você pode usar qualquer uma dessas chaves para recuperar informações adicionais sobre cada uma dessas chaves que podem ser lidas acrescentando o nome da chave (sem aspas) à raiz do Cônsul KV em http://localhost:8500/v1/kv/. Essa ação apresenta 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 em Base64 UTF-8 Value fornece os dados reais de 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 são conectados, eles leem os KVs para 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

Há algumas limitações a serem consideradas ao usar o Consul como um provedor de associação.

Protocolo de associação estendido do Orleans (ETag e versão da tabela)

No momento, não há suporte para atualizações atômicas no KV. Portanto, o Provedor de Associação do Consul do Orleans implementa apenas o protocolo de associação básico do Orleans, conforme descrito no Gerenciamento de Clusters do Orleans, e não dá suporte ao Protocolo de Associação Estendido. Esse protocolo Estendido foi introduzido como validação de conectividade de silo extra, mas não essencial, e como base para a funcionalidade que ainda não foi implementada.

Vários datacenters

No momento, os pares de chave-valor no Consul não são replicados entre os data centers do Consul. Há um projeto separado para resolver esse esforço de replicação, mas ainda não foi provado que ele dá 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.

Essa mensagem de aviso é exibida devido à falta de foco nos testes durante a execução em um ambiente do Windows e não devido a problemas reais conhecidos. Leia a discussão, antes de decidir se o Consul é a escolha certa para você.

Possíveis aprimoramentos futuros

  1. Comprove que o projeto de replicação de KV do Consul pode ser compatível com um cluster do Orleans em um ambiente de WAN entre vários data centers do Consul.
  2. Implemente a Tabela de Lembretes no Consul.
  3. Implemente o Protocolo de Associação Estendido. A equipe do Consul planeja implementar operações atômicas. Quando essa funcionalidade estiver disponível, será possível eliminar as limitações no provedor.