Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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
ClusterIdcomo"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 umClusterIddiferente para implantações diferentes. - Defina o
ServiceIdpara"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
ClusterIdcomo"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 umClusterIddiferente para implantações diferentes. - Defina o
ServiceIdpara"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:
- ApplicationPartManagerExtensions.AddApplicationPart: adicione um único assembly por meio deste método de extensão.
-
ApplicationPartManagerExtensions.AddFromAppDomain: adiciona todos os componentes atualmente carregados no
AppDomain. - ApplicationPartManagerExtensions.AddFromApplicationBaseDirectory: carrega e adiciona todos os assemblies no caminho base atual (consulte AppDomain.BaseDirectory).
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.OrleansCodeGeneratorpacote 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.