Partilhar via


Configuração do servidor

Um silo é configurado programaticamente com o UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) método extension e várias classes de opção suplementares. As classes de opção seguem Orleans o padrão Options no .NET e podem ser carregadas por meio de arquivos, variáveis de ambiente e qualquer provedor de configuração válido.

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

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

Este é um exemplo de uma configuração de silo que define informações de cluster, usa clustering do Azure e configura as partes do aplicativo:

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

Gorjeta

Ao desenvolver para Orleanso , 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 clustering

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

Normalmente, um serviço baseado é Orleans implantado em um cluster de nós, seja em hardware dedicado ou na nuvem. Para desenvolvimento e testes básicos, Orleans pode ser implantado em uma configuração de nó único. Quando implantado em um cluster de nós, Orleans implementa internamente um conjunto de protocolos para descobrir e manter a associação de Orleans silos no cluster, incluindo deteção de falhas de nó e reconfiguração automática.

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

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

Orleans informações de agrupamento

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

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

Aqui você especifica duas opções:

  • Defina como ClusterId "my-first-cluster": este é um ID exclusivo para o Orleans cluster. Todos os clientes e silos que usam esse ID poderão falar diretamente uns com os outros. No entanto, você pode optar por usar um diferente ClusterId para implantações diferentes.
  • Defina como ServiceId "SampleApp": esta é uma ID exclusiva para seu aplicativo que será usada por alguns provedores, como provedores de persistência. Esse ID deve permanecer estável e não deve ser alterado entre implantações.

Por padrão, Orleans usará um valor de "default" para o ServiceId e o ClusterId. Esses valores não precisam ser alterados na maioria dos casos. ServiceId é o mais significativo dos dois e é usado para distinguir diferentes serviços lógicos uns dos outros para que eles possam compartilhar sistemas de armazenamento de back-end sem interferir uns com os outros. ClusterId é usado para determinar quais hosts se conectarão uns aos outros e formarão 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 uma nova implantação (cluster) é iniciada antes que outra seja encerrada. Isso é típico para sistemas hospedados no Serviço de Aplicativo do Azure.

O caso mais comum é esse ServiceId e ClusterId permanecer fixo durante o tempo de vida do aplicativo e uma estratégia de implantação contínua é usada. Isso é típico para sistemas hospedados no Kubernetes e no Service Fabric.

Pontos finais

Por padrão, Orleans escutará em todas as interfaces na porta 11111 para comunicação silo para silo e na porta 30000 para comunicação cliente-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:

  • 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 final:

  • Os pontos de extremidade de silo para silo são usados para comunicação entre silos no mesmo cluster.
  • Os pontos de extremidade cliente-para-silo (ou gateway) são 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 precisar. Aqui está um exemplo de como usar um endereço IP externo com algum 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 ouvirá e 0.0.0.0:40000 0.0.0.0:50000, mas o valor publicado no provedor de associação será 172.16.0.42:11111 e 172.16.0.42:30000.

Um silo é configurado programaticamente via SiloHostBuilder e várias classes de opção suplementares. As classes de opção seguem Orleans o padrão Options no .NET e podem ser carregadas por meio de arquivos, variáveis de ambiente e qualquer provedor de configuração válido.

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

  • Orleans informações de agrupamento
  • Provedor de clustering
  • Pontos de extremidade a serem usados para comunicações silo a silo e cliente a silo
  • Peças de aplicação

Este é um exemplo de uma configuração de silo que define informações de cluster, usa clustering do Azure e configura as 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:

Provedor de clustering

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

Normalmente, um serviço baseado é Orleans implantado em um cluster de nós, seja em hardware dedicado ou na nuvem. Para desenvolvimento e testes básicos, Orleans pode ser implantado em uma configuração de nó único. Quando implantado em um cluster de nós, Orleans implementa internamente um conjunto de protocolos para descobrir e manter a associação de Orleans silos no cluster, incluindo deteção de falhas de nó e reconfiguração automática.

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

Neste exemplo, estamos usando 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 como ClusterId "my-first-cluster": este é um ID exclusivo para o Orleans cluster. Todos os clientes e silos que usam esse ID poderão falar diretamente uns com os outros. No entanto, você pode optar por usar um diferente ClusterId para implantações diferentes.
  • Defina como ServiceId "AspNetSampleApp": esta é uma ID exclusiva para seu aplicativo que será usada por alguns provedores, como provedores de persistência. Esse ID deve permanecer estável e não deve ser alterado entre implantações.

Por padrão, Orleans usará um valor de "default" para o ServiceId e o ClusterId. Esses valores não precisam ser alterados na maioria dos casos. ServiceId é o mais significativo dos dois e é usado para distinguir diferentes serviços lógicos uns dos outros para que eles possam compartilhar sistemas de armazenamento de back-end sem interferir uns com os outros. ClusterId é usado para determinar quais hosts se conectarão uns aos outros e formarão 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 uma nova implantação (cluster) é iniciada antes que outra seja encerrada. Isso é típico para sistemas hospedados no Serviço de Aplicativo do Azure.

O caso mais comum é esse ServiceId e ClusterId permanecer fixo durante o tempo de vida do aplicativo e uma estratégia de implantação contínua é usada. 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:

  • Pontos finais de silo para silo, usados para comunicação entre silos no mesmo cluster
  • Pontos de extremidade de cliente para silo (ou gateway), usados para comunicação entre clientes e silos no mesmo cluster

No exemplo, estamos usando o método .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000) auxiliar que define a porta usada para comunicação silo a silo e 11111 a porta para o gateway para 30000. Este método irá detetar qual interface ouvir.

Esse método deve ser suficiente na maioria dos casos, mas você pode personalizá-lo ainda mais se precisar. Aqui está um exemplo de como usar um endereço IP externo com algum 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 ouvirá e 0.0.0.0:40000 0.0.0.0:50000, mas o valor publicado no provedor de associação será 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 configurada, Orleans verificará todos os assemblies na pasta atual), os desenvolvedores são incentivados a configurá-la. Esta etapa ajudará a Orleans carregar assemblies e tipos de usuários. Esses assemblies são chamados de Partes de Aplicação. Todos os grãos, interfaces de grão e serializadores são descobertos usando partes do aplicativo.

As partes do aplicativo são configuradas usando IApplicationPartManager, que pode ser acessado usando o ConfigureApplicationParts método de extensão em IClientBuilder e ISiloHostBuilder. O ConfigureApplicationParts método aceita um delegado, Action<IApplicationPartManager>.

Os seguintes métodos de extensão no suporte a IApplicationPartManager usos comuns:

As montagens adicionadas pelos métodos acima podem ser complementadas usando os seguintes métodos de extensão em seu tipo de retorno, IApplicationPartManagerWithAssemblies:

  • ApplicationPartManagerExtensions.WithReferences adiciona todos os assemblies referenciados 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 peças adicionadas e adiciona-o ao gerenciador de peças. Observe que isso requer que o Microsoft.Orleans.OrleansCodeGenerator pacote seja instalado 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, o código pode ser gerado durante o tempo de configuração através do WithCodeGeneration método descrito acima. Mais informações sobre a geração de código podem ser encontradas na seção correspondente.