Compartilhar via


Configuração de Servidor

Configure um silo programaticamente usando o UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) método de extensão e várias classes de opção complementares. As classes Orleans de opção seguem o padrão Opções no .NET e podem ser carregadas de arquivos, variáveis de ambiente ou qualquer outro provedor de configuração válido.

Há vários aspectos principais da configuração do silo:

  • Provedor de agrupamento
  • (Opcional) Orleans informações de agrupamento
  • (Opcional) Pontos de extremidade para comunicações de silo a silo e de cliente a silo

Este exemplo mostra uma configuração de silo definindo informações de cluster, usando clustering do Azure e configurando partes do aplicativo:

using IHost host = Host.CreateDefaultBuilder(args)
    .UseOrleans(builder =>
    {
        builder.UseAzureStorageClustering(
            options => options.ConfigureTableServiceClient(connectionString));
    })
    .UseConsoleLifetime()
    .Build();

Dica

Ao desenvolver para Orleans, você pode chamar UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) para configurar um cluster local. Em ambientes de produção, você deve usar um provedor de clustering adequado para sua implantação.

Provedor de agrupamento

siloBuilder.UseAzureStorageClustering(
    options => options.ConfigureTableServiceClient(connectionString))

Normalmente, você implanta um serviço baseado em Orleans em um cluster de nós, seja em hardware dedicado ou na nuvem. Para desenvolvimento e teste básico, você pode implantar Orleans em uma configuração de nó único. Quando implantado em um cluster de nós, Orleans implementa internamente protocolos para descobrir e manter os membros dos silos de Orleans no cluster, incluindo detectar falhas nos nós e realizar reconfiguração automática.

Para gerenciamento de associação de cluster confiável, Orleans usa a Tabela do Azure, o SQL Server ou o Apache ZooKeeper para sincronização de nós.

Neste exemplo, usamos a Tabela do Azure como o provedor de associação.

Orleans informações de agrupamento

Para configurar opcionalmente o clustering, use ClusterOptions como o parâmetro de tipo para o método Configure na instância ISiloBuilder.

siloBuilder.Configure<ClusterOptions>(options =>
{
    options.ClusterId = "my-first-cluster";
    options.ServiceId = "SampleApp";
})

Aqui, você especifica duas opções:

  • Defina o ClusterId como "my-first-cluster": esta é uma identificação exclusiva para o cluster Orleans. Todos os clientes e silos que usam essa ID podem se comunicar diretamente entre si. Você pode, no entanto, optar por usar um ClusterId diferente para implantações diferentes.
  • Defina o ServiceId para "SampleApp": este é um ID exclusivo para seu aplicativo usado por alguns provedores, como os de persistência. Essa ID deve permanecer estável e não mudar entre implantações.

Por padrão, Orleans usa "default" para ambos ServiceId e ClusterId. Esses valores não precisam ser alterados na maioria dos casos. ServiceId é mais significativo e distingue diferentes serviços lógicos, permitindo que eles compartilhem sistemas de armazenamento de back-end sem interferência. ClusterId determina quais hosts se conectam para formar um cluster.

Em cada cluster, todos os hosts devem usar o mesmo ServiceId. No entanto, vários clusters podem compartilhar um ServiceId. Isso permite cenários de implantação azul/verde em que você inicia uma nova implantação (cluster) antes de desligar outra. Isso é típico para sistemas hospedados no Serviço de Aplicativo do Azure.

O caso mais comum é que ServiceId e ClusterId permaneçam fixos durante o tempo de vida do aplicativo, e você utilize uma estratégia de implantação sem interrupção. Isso é típico para sistemas hospedados no Kubernetes e no Service Fabric.

Pontos de extremidade

Por padrão, Orleans escuta em todas as interfaces na porta 11111 para comunicação entre silos e porta 30000 para comunicação entre cliente e silo. Para substituir esse comportamento, chame ConfigureEndpoints(ISiloBuilder, Int32, Int32, AddressFamily, Boolean) e passe os números de porta que você deseja usar.

siloBuilder.ConfigureEndpoints(siloPort: 17_256, gatewayPort: 34_512)

No código anterior apresentado:

  • A porta do silo está definida como 17_256.
  • A porta do gateway está definida como 34_512.

Um Orleans silo tem dois tipos típicos de configuração de ponto de extremidade:

  • Pontos de extremidade entre silos: utilizados para comunicação entre silos no mesmo cluster.
  • Pontos de extremidade cliente a silo (ou gateway): usados para comunicação entre clientes e silos no mesmo cluster.

Esse método deve ser suficiente na maioria dos casos, mas você pode personalizá-lo ainda mais, se necessário. Aqui está um exemplo de como usar um endereço IP externo com encaminhamento de porta:

siloBuilder.Configure<EndpointOptions>(options =>
{
    // Port to use for silo-to-silo
    options.SiloPort = 11_111;
    // Port to use for the gateway
    options.GatewayPort = 30_000;
    // IP Address to advertise in the cluster
    options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42");
    // The socket used for client-to-silo will bind to this endpoint
    options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40_000);
    // The socket used by the gateway will bind to this endpoint
    options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50_000);
})

Internamente, o silo escuta 0.0.0.0:40000 e 0.0.0.0:50000, mas o valor publicado no provedor de associação é 172.16.0.42:11111 e 172.16.0.42:30000.

Configure um silo programaticamente por meio de SiloHostBuilder e de várias classes de opções complementares. As classes Orleans de opção seguem o padrão Opções no .NET e podem ser carregadas de arquivos, variáveis de ambiente ou qualquer outro provedor de configuração válido.

Há vários aspectos principais da configuração do silo:

  • Orleans informações de agrupamento
  • Provedor de agrupamento
  • Pontos de extremidade para comunicações de silo a silo e cliente para silo
  • Partes do aplicativo

Este exemplo mostra uma configuração de silo definindo informações de cluster, usando clustering do Azure e configurando partes do aplicativo:

var silo = Host.CreateDefaultBuilder(args)
    .UseOrleans(builder =>
    {
        builder
            .UseAzureStorageClustering(
                options => options.ConnectionString = connectionString)
            .Configure<ClusterOptions>(options =>
            {
                options.ClusterId = "my-first-cluster";
                options.ServiceId = "AspNetSampleApp";
            })
            .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
            .ConfigureApplicationParts(
                parts => parts.AddApplicationPart(typeof(ValueGrain).Assembly).WithReferences())
    })
    .UseConsoleLifetime()
    .Build();

Vamos dividir as etapas usadas neste exemplo:

Provedor de agrupamento

siloBuilder.UseAzureStorageClustering(
    options => options.ConnectionString = connectionString)

Normalmente, você implanta um serviço baseado em Orleans em um cluster de nós, seja em hardware dedicado ou na nuvem. Para desenvolvimento e teste básico, você pode implantar Orleans em uma configuração de nó único. Quando implantado em um cluster de nós, Orleans implementa internamente protocolos para descobrir e manter os membros dos silos de Orleans no cluster, incluindo detectar falhas nos nós e realizar reconfiguração automática.

Para gerenciamento de associação de cluster confiável, Orleans usa a Tabela do Azure, o SQL Server ou o Apache ZooKeeper para sincronização de nós.

Neste exemplo, usamos a Tabela do Azure como o provedor de associação.

Orleans informações de agrupamento

.Configure<ClusterOptions>(options =>
{
    options.ClusterId = "my-first-cluster";
    options.ServiceId = "AspNetSampleApp";
})

Aqui, fazemos duas coisas:

  • Defina o ClusterId como "my-first-cluster": esta é uma identificação exclusiva para o cluster Orleans. Todos os clientes e silos que usam essa ID podem se comunicar diretamente entre si. Você pode, no entanto, optar por usar um ClusterId diferente para implantações diferentes.
  • Defina o ServiceId para "AspNetSampleApp": este é um ID exclusivo para seu aplicativo usado por alguns provedores, como os de persistência. Essa ID deve permanecer estável e não mudar entre implantações.

Por padrão, Orleans usa "default" para ambos ServiceId e ClusterId. Esses valores não precisam ser alterados na maioria dos casos. ServiceId é mais significativo e distingue diferentes serviços lógicos, permitindo que eles compartilhem sistemas de armazenamento de back-end sem interferência. ClusterId determina quais hosts se conectam para formar um cluster.

Em cada cluster, todos os hosts devem usar o mesmo ServiceId. No entanto, vários clusters podem compartilhar um ServiceId. Isso permite cenários de implantação azul/verde em que você inicia uma nova implantação (cluster) antes de desligar outra. Isso é típico para sistemas hospedados no Serviço de Aplicativo do Azure.

O caso mais comum é que ServiceId e ClusterId permaneçam fixos durante o tempo de vida do aplicativo, e você utilize uma estratégia de implantação sem interrupção. Isso é típico para sistemas hospedados no Kubernetes e no Service Fabric.

Pontos de extremidade

siloBuilder.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)

Um Orleans silo tem dois tipos típicos de configuração de ponto de extremidade:

  • Pontos de extremidade entre silos: utilizados para comunicação entre silos no mesmo cluster.
  • Pontos de extremidade cliente a silo (ou gateway): usados para comunicação entre clientes e silos no mesmo cluster.

No exemplo, usamos o método auxiliar .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000), que define a porta para a comunicação entre silos em 11111 e a porta do gateway em 30000. Esse método detecta em qual interface escutar.

Esse método deve ser suficiente na maioria dos casos, mas você pode personalizá-lo ainda mais, se necessário. Aqui está um exemplo de como usar um endereço IP externo com encaminhamento de porta:

siloBuilder.Configure<EndpointOptions>(options =>
{
    // Port to use for silo-to-silo
    options.SiloPort = 11111;
    // Port to use for the gateway
    options.GatewayPort = 30000;
    // IP Address to advertise in the cluster
    options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42");
    // The socket used for client-to-silo will bind to this endpoint
    options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40000);
    // The socket used by the gateway will bind to this endpoint
    options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50000);
})

Internamente, o silo escuta 0.0.0.0:40000 e 0.0.0.0:50000, mas o valor publicado no provedor de associação é 172.16.0.42:11111 e 172.16.0.42:30000.

Partes do aplicativo

siloBuilder.ConfigureApplicationParts(
    parts => parts.AddApplicationPart(
        typeof(ValueGrain).Assembly)
        .WithReferences())

Embora essa etapa não seja tecnicamente necessária (se não estiver configurada, Orleans verifica todos os assemblies na pasta atual), recomendamos que você a configure. Esta etapa ajuda a Orleans carregar assemblies e tipos de usuário. Esses assemblies são conhecidos como Partes do Aplicativo. Orleans descobre todos os Grains, Interfaces de Grains e Serializadores usando Partes de Aplicativo.

Configure as Partes da Aplicação usando IApplicationPartManager, acessíveis por meio do método de extensão ConfigureApplicationParts em IClientBuilder e ISiloHostBuilder. O ConfigureApplicationParts método aceita um delegado. Action<IApplicationPartManager>

Os seguintes métodos de extensão em IApplicationPartManager oferecem suporte para usos comuns:

Assembléias de suplemento adicionadas pelos métodos acima usando os seguintes métodos de extensão sobre seu tipo de retorno: IApplicationPartManagerWithAssemblies

  • ApplicationPartManagerExtensions.WithReferences: Adiciona todos os conjuntos referenciados pelas partes adicionadas. Isso carrega imediatamente todos os assemblies referenciados transitivamente. Os erros de carregamento do assembly são ignorados.
  • ApplicationPartManagerCodeGenExtensions.WithCodeGeneration: gera o código de suporte para as partes adicionadas e adiciona-o ao gerenciador de partes. Observe que isso requer a instalação do Microsoft.Orleans.OrleansCodeGenerator pacote e geralmente é chamado de geração de código de runtime.

A descoberta de tipo requer que as Partes de Aplicativo fornecidas incluam atributos específicos. Adicionar o pacote de geração de código durante o tempo de build (Microsoft.Orleans.CodeGenerator.MSBuild ou Microsoft.Orleans.OrleansCodeGenerator.Build) a cada projeto que contém Grains, Interfaces de Grains ou Serializadores é a abordagem recomendada para garantir a presença destes atributos. A geração de código em tempo de build só dá suporte a C#. Para F#, Visual Basic e outras linguagens .NET, você pode gerar código durante o tempo de configuração por meio do WithCodeGeneration método descrito acima. Encontre mais informações sobre a geração de código na seção correspondente.