Partilhar via


Configuração do servidor

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

Existem vários aspectos-chave da configuração do silo:

  • Fornecedor de serviços de clustering
  • (Opcional) Orleans informações de agrupamento
  • (Opcional) Pontos de extremidade para comunicações silo a silo e 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();

Sugestão

Ao desenvolver para Orleans, podes 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.

Fornecedor de serviços de clustering

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

Normalmente, implanta-se um serviço construído em Orleans num cluster de nós, seja em hardware dedicado ou na nuvem. Para desenvolvimento e testes básicos, pode-se implantar Orleans numa configuração de nó singular. Quando implantado em um cluster de nós, Orleans implementa internamente protocolos para descobrir e manter a associação de silos Orleans no cluster, incluindo a detecção de falhas de nós e a reconfiguração automática.

Para uma gestão confiável da associação do cluster, Orleans utiliza a Tabela do Azure, o SQL Server ou o Apache ZooKeeper para a sincronização dos nós.

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

Orleans informações de agrupamento

Para configurar o clustering de forma opcional, use ClusterOptions como parâmetro 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 ClusterId para "my-first-cluster". Este é um ID exclusivo para o cluster Orleans. Todos os clientes e silos que usam esse ID podem falar diretamente uns com os outros. No entanto, você pode optar por usar um diferente ClusterId para implantações diferentes.
  • Defina o ServiceId para "SampleApp": Esta é uma ID única para a sua aplicação utilizada por alguns fornecedores, como os fornecedores de persistência. Esse ID deve permanecer estável e não deve ser alterado entre implantações.

Por padrão, Orleans usa "default" tanto para ServiceId como para ClusterId. Esses valores não precisam ser alterados na maioria dos casos. ServiceId é mais significativa 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.

Dentro de 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 encerrar 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 a duração da aplicação, e utilize uma estratégia de implantação contínua. Isso é típico para sistemas hospedados no Kubernetes e no Service Fabric.

Pontos finais

Por padrão, Orleans escuta em todas as interfaces na porta 11111 para a comunicação entre silos e na porta 30000 para a 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:

  • O portão do silo está definido para 17_256.
  • A porta do gateway está definida como 34_512.

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

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

Este 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 ouve em 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 através de SiloHostBuilder e de várias classes suplementares de opções. As classes de opção seguem Orleans o padrão Opções no .NET e podem ser carregadas a partir de arquivos, variáveis de ambiente ou qualquer outro provedor de configuração válido.

Existem vários aspectos-chave da configuração do silo:

  • Orleans informações de agrupamento
  • Fornecedor de serviços de clustering
  • Pontos de extremidade para comunicações silo a silo e cliente a silo
  • Peças de aplicação

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 detalhar as etapas usadas neste exemplo:

Fornecedor de serviços de clustering

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

Normalmente, implanta-se um serviço construído em Orleans num cluster de nós, seja em hardware dedicado ou na nuvem. Para desenvolvimento e testes básicos, pode-se implantar Orleans numa configuração de nó singular. Quando implantado em um cluster de nós, Orleans implementa internamente protocolos para descobrir e manter a associação de silos Orleans no cluster, incluindo a detecção de falhas de nós e a reconfiguração automática.

Para uma gestão confiável da associação do cluster, Orleans utiliza a Tabela do Azure, o SQL Server ou o Apache ZooKeeper para a sincronização dos 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 ClusterId para "my-first-cluster". Este é um ID exclusivo para o cluster Orleans. Todos os clientes e silos que usam esse ID podem falar diretamente uns com os outros. No entanto, você pode optar por usar um diferente ClusterId para implantações diferentes.
  • Defina o ServiceId para "AspNetSampleApp": Esta é uma ID única para a sua aplicação utilizada por alguns fornecedores, como os fornecedores de persistência. Esse ID deve permanecer estável e não deve ser alterado entre implantações.

Por padrão, Orleans usa "default" tanto para ServiceId como para ClusterId. Esses valores não precisam ser alterados na maioria dos casos. ServiceId é mais significativa 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.

Dentro de 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 encerrar 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 a duração da aplicação, e utilize uma estratégia de implantação contínua. Isso é típico para sistemas hospedados no Kubernetes e no Service Fabric.

Pontos finais

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

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

  • Endpoints de silo a silo: usados para comunicação entre silos no mesmo cluster.
  • Endpoints cliente-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 configura a porta para comunicação de silo para silo para 11111 e a porta de gateway para 30000. Este método deteta em qual interface escutar.

Este 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 ouve em 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.

Peças de aplicação

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

Embora esta 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 Orleans a carregar assemblagens e tipos de utilizadores. Esses assemblies são chamados de Partes de Aplicação. Orleans descobre todos os grãos, interfaces de grãos e serializadores usando partes de aplicativos.

Configure as partes da aplicação usando IApplicationPartManager, acessível através 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 suportam usos comuns:

Conjuntos complementares adicionados pelos métodos acima usando os seguintes métodos de extensão em seu tipo de retorno, IApplicationPartManagerWithAssemblies:

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

A descoberta de tipo requer que as partes do aplicativo fornecidas incluam atributos específicos. Adicionar o pacote de geração de código em tempo de compilação (Microsoft.Orleans.CodeGenerator.MSBuild ou Microsoft.Orleans.OrleansCodeGenerator.Build) a cada projeto contendo grãos, interfaces de grãos ou serializadores é a abordagem recomendada para garantir que esses atributos estejam presentes. A geração de código em tempo de compilação suporta apenas 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.