Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Abaixo estão exemplos de configurações típicas que você pode usar para implantações de desenvolvimento e produção.
Recomendado: configuração .NET Aspire
.NET Aspire é a abordagem recomendada para configurar aplicações Orleans. Aspire proporciona gestão declarativa de recursos, descoberta automática de serviços, observabilidade incorporada e implementação simplificada — eliminando a maior parte da configuração manual.
Configuração de produção com Redis
Esta configuração utiliza o Redis para clustering, armazenamento de grãos e lembretes com múltiplas réplicas de silos:
Projeto AppHost (Program.cs):
var builder = DistributedApplication.CreateBuilder(args);
var redis = builder.AddRedis("redis");
var orleans = builder.AddOrleans("cluster")
.WithClustering(redis)
.WithGrainStorage("Default", redis)
.WithReminders(redis);
// Add Orleans silo with 3 replicas for production
builder.AddProject<Projects.MySilo>("silo")
.WithReference(orleans)
.WithReference(redis)
.WithReplicas(3);
// Add a separate client project (e.g., an API)
builder.AddProject<Projects.MyApi>("api")
.WithReference(orleans.AsClient())
.WithReference(redis);
builder.Build().Run();
Projeto Silo (Program.cs):
var builder = Host.CreateApplicationBuilder(args);
builder.AddServiceDefaults();
builder.AddKeyedRedisClient("redis");
builder.UseOrleans();
builder.Build().Run();
Projeto do cliente (Program.cs):
var builder = WebApplication.CreateBuilder(args);
builder.AddServiceDefaults();
builder.AddKeyedRedisClient("redis");
builder.UseOrleansClient();
var app = builder.Build();
// ... configure API endpoints
app.Run();
Sugestão
Uso WithReplicas(n) para executar múltiplas instâncias de silos para alta disponibilidade. Use orleans.AsClient() quando um projeto só precisa de chamar grãos, não de os hospedar.
Configuração de produção com Armazenamento do Azure
Esta configuração utiliza o Armazenamento de Tabelas do Azure para clusterização e o Armazenamento de Blobs do Azure para armazenamento de grãos:
Projeto AppHost (Program.cs):
var builder = DistributedApplication.CreateBuilder(args);
var storage = builder.AddAzureStorage("storage")
.RunAsEmulator(); // Use Azurite for local development
var tables = storage.AddTables("clustering");
var blobs = storage.AddBlobs("grainstate");
var orleans = builder.AddOrleans("cluster")
.WithClustering(tables)
.WithGrainStorage("Default", blobs);
builder.AddProject<Projects.MySilo>("silo")
.WithReference(orleans)
.WaitFor(storage)
.WithReplicas(3);
builder.Build().Run();
Projeto Silo (Program.cs):
var builder = Host.CreateApplicationBuilder(args);
builder.AddServiceDefaults();
builder.AddKeyedAzureTableServiceClient("clustering");
builder.AddKeyedAzureBlobServiceClient("grainstate");
builder.UseOrleans();
builder.Build().Run();
Sugestão
Para usar o emulador Azurite para desenvolvimento local, recorra .RunAsEmulator() ao recurso Armazenamento do Azure como mostrado acima. Sem esta chamada, Aspire espera uma ligação Armazenamento do Azure real. Em implementações em produção, remova .RunAsEmulator() e configure a ligação da sua conta Armazenamento do Azure.
Importante
Deve chamar o método apropriado AddKeyed* (como AddKeyedRedisClient, AddKeyedAzureTableServiceClient, ou AddKeyedAzureBlobServiceClient) para registar o recurso de apoio no contentor de injeção de dependências.
Orleans Os fornecedores procuram os recursos pelo nome do serviço com chave — se saltar este passo, Orleans não será possível resolver o recurso e gerará um erro de resolução de dependências em tempo de execução.
Para documentação abrangente sobre integração Orleans e .NET Aspire, veja Orleans e .NET Aspire integração.
Desenvolvimento local
Para obter mais informações, consulte Configuração de desenvolvimento local.
Configurações tradicionais (sem Aspire)
As secções seguintes descrevem configurações tradicionais Orleans que não utilizam .NET Aspire. Estes são úteis quando Aspire não estão disponíveis ou quando precisas de controlo minucioso sobre Orleans a configuração.
Implantação de produção confiável usando o Azure
Para uma implantação de produção confiável usando o Azure, use a opção Tabela do Azure para associação ao cluster. Essa configuração é típica para implantações em servidores locais, contêineres ou instâncias de máquina virtual do Azure.
Usar um TokenCredential URI com serviço é a abordagem recomendada. Este padrão evita armazenar segredos na configuração e aproveita o Microsoft Entra ID para autenticação segura.
DefaultAzureCredential Fornece uma cadeia de credenciais que funciona de forma fluida em ambientes locais de desenvolvimento e produção. Durante o desenvolvimento, utiliza as credenciais CLI do Azure ou Visual Studio. Em produção no Azure, utiliza automaticamente a identidade gerida atribuída ao seu recurso.
Sugestão
DefaultAzureCredential funciona de forma fluida entre o desenvolvimento e a produção local. No desenvolvimento, utiliza as credenciais do CLI do Azure ou Visual Studio. Em produção no Azure, utiliza automaticamente a identidade gerida do recurso. Para melhorar o desempenho e a depurabilidade em produção, considere substituí-lo por uma credencial específica como ManagedIdentityCredential. Para mais informações, consulte Orientação de utilização para o DefaultAzureCredential.
Configuração do silo:
using Azure.Identity;
var builder = Host.CreateApplicationBuilder(args);
builder.UseOrleans(siloBuilder =>
{
siloBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.UseAzureStorageClustering(options =>
{
options.ConfigureTableServiceClient(
new Uri("https://<your-storage-account>.table.core.windows.net"),
new DefaultAzureCredential());
})
.ConfigureEndpoints(siloPort: 11_111, gatewayPort: 30_000);
});
builder.Logging.SetMinimumLevel(LogLevel.Information).AddConsole();
using var host = builder.Build();
Configuração do cliente:
using Azure.Identity;
var builder = Host.CreateApplicationBuilder(args);
builder.UseOrleansClient(clientBuilder =>
{
clientBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.UseAzureStorageClustering(options =>
{
options.ConfigureTableServiceClient(
new Uri("https://<your-storage-account>.table.core.windows.net"),
new DefaultAzureCredential());
});
});
using var host = builder.Build();
Implantação de produção confiável usando o Azure
Para uma implantação de produção confiável usando o Azure, use a opção Tabela do Azure para associação ao cluster. Essa configuração é típica para implantações em servidores locais, contêineres ou instâncias de máquina virtual do Azure.
O formato da DataConnection cadeia de caracteres é uma lista de pares separada por Key=Value ponto-e-vírgula. As seguintes opções são suportadas:
| Chave | Valor |
|---|---|
DefaultEndpointsProtocol |
https |
AccountName |
<Azure storage account> |
AccountKey |
<Azure table storage account key> |
A seguir está um exemplo de uma cadeia de caracteres para o DataConnection armazenamento de tabela do Azure:
"DefaultEndpointsProtocol=https;AccountName=<Azure storage account>;AccountKey=<Azure table storage account key>"
Configuração do silo:
const string connectionString = "YOUR_CONNECTION_STRING_HERE";
var silo = new SiloHostBuilder()
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.UseAzureStorageClustering(
options => options.ConnectionString = connectionString)
.ConfigureEndpoints(siloPort: 11_111, gatewayPort: 30_000)
.ConfigureLogging(builder => builder.SetMinimumLevel(LogLevel.Information).AddConsole())
.Build();
Configuração do cliente:
const string connectionString = "YOUR_CONNECTION_STRING_HERE";
var client = new ClientBuilder()
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.UseAzureStorageClustering(
options => options.ConnectionString = connectionString)
.Build();
Implantação de produção confiável usando o SQL Server
Para uma implantação de produção confiável usando o SQL Server, forneça uma cadeia de conexão do SQL Server.
Observação
A partir da Orleans versão 10.0, ADO.NET fornecedores exigem o Microsoft.Data.SqlClient pacote em vez de System.Data.SqlClient. Use o invariante Microsoft.Data.SqlClient na Orleans versão 10.0 e posteriores.
Orleans 10.0+
const string connectionString = "YOUR_CONNECTION_STRING_HERE";
var builder = Host.CreateApplicationBuilder(args);
builder.UseOrleans(siloBuilder =>
{
siloBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.UseAdoNetClustering(options =>
{
options.ConnectionString = connectionString;
options.Invariant = "Microsoft.Data.SqlClient"; // Orleans 10.0+
})
.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000);
});
builder.Logging.SetMinimumLevel(LogLevel.Information).AddConsole();
using var host = builder.Build();
Orleans 7.0-9.x
const string connectionString = "YOUR_CONNECTION_STRING_HERE";
var builder = Host.CreateApplicationBuilder(args);
builder.UseOrleans(siloBuilder =>
{
siloBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.UseAdoNetClustering(options =>
{
options.ConnectionString = connectionString;
options.Invariant = "System.Data.SqlClient";
})
.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000);
});
builder.Logging.SetMinimumLevel(LogLevel.Information).AddConsole();
using var host = builder.Build();
Configuração do cliente:
const string connectionString = "YOUR_CONNECTION_STRING_HERE";
var builder = Host.CreateApplicationBuilder(args);
builder.UseOrleansClient(clientBuilder =>
{
clientBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.UseAdoNetClustering(options =>
{
options.ConnectionString = connectionString;
// Use "Microsoft.Data.SqlClient" for Orleans 10.0+
// Use "System.Data.SqlClient" for Orleans 7.0-9.x
options.Invariant = "Microsoft.Data.SqlClient";
});
});
using var host = builder.Build();
Implantação não confiável em um cluster de servidores dedicados
Para testar em um cluster de servidores dedicados onde a confiabilidade não é uma preocupação, você pode aproveitar MembershipTableGrain e evitar a dependência da Tabela do Azure. Você só precisa designar um dos nós como primário.
Nos silos:
var primarySiloEndpoint = new IPEndPoint(PRIMARY_SILO_IP_ADDRESS, 11_111);
var builder = Host.CreateApplicationBuilder(args);
builder.UseOrleans(siloBuilder =>
{
siloBuilder
.UseDevelopmentClustering(primarySiloEndpoint)
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.ConfigureEndpoints(siloPort: 11_111, gatewayPort: 30_000);
});
builder.Logging.AddConsole();
using var host = builder.Build();
await host.RunAsync();
Sobre os clientes:
var gateways = new IPEndPoint[]
{
new IPEndPoint(PRIMARY_SILO_IP_ADDRESS, 30_000),
new IPEndPoint(OTHER_SILO__IP_ADDRESS_1, 30_000),
// ...
new IPEndPoint(OTHER_SILO__IP_ADDRESS_N, 30_000),
};
var builder = Host.CreateApplicationBuilder(args);
builder.UseOrleansClient(clientBuilder =>
{
clientBuilder.UseStaticClustering(gateways)
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
});
});
using var host = builder.Build();
await host.StartAsync();
Implantação de produção confiável usando o SQL Server
Para uma implantação de produção confiável usando o SQL Server, forneça uma cadeia de conexão do SQL Server.
Configuração do silo:
const string connectionString = "YOUR_CONNECTION_STRING_HERE";
var silo = new SiloHostBuilder()
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.UseAdoNetClustering(options =>
{
options.ConnectionString = connectionString;
options.Invariant = "System.Data.SqlClient";
})
.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
.ConfigureLogging(builder => builder.SetMinimumLevel(LogLevel.Information).AddConsole())
.Build();
Configuração do cliente:
const string connectionString = "YOUR_CONNECTION_STRING_HERE";
var client = new ClientBuilder()
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.UseAdoNetClustering(options =>
{
options.ConnectionString = connectionString;
options.Invariant = "System.Data.SqlClient";
})
.Build();
Implantação não confiável em um cluster de servidores dedicados
Para testar em um cluster de servidores dedicados onde a confiabilidade não é uma preocupação, você pode aproveitar MembershipTableGrain e evitar a dependência da Tabela do Azure. Você só precisa designar um dos nós como primário.
Nos silos:
var primarySiloEndpoint = new IPEndPoint(PRIMARY_SILO_IP_ADDRESS, 11_111);
var silo = new SiloHostBuilder()
.UseDevelopmentClustering(primarySiloEndpoint)
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.ConfigureEndpoints(siloPort: 11_111, gatewayPort: 30_000)
.ConfigureLogging(logging => logging.AddConsole())
.Build();
Sobre os clientes:
var gateways = new IPEndPoint[]
{
new IPEndPoint(PRIMARY_SILO_IP_ADDRESS, 30_000),
new IPEndPoint(OTHER_SILO__IP_ADDRESS_1, 30_000),
// ...
new IPEndPoint(OTHER_SILO__IP_ADDRESS_N, 30_000),
};
var client = new ClientBuilder()
.UseStaticClustering(gateways)
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "Cluster42";
options.ServiceId = "MyAwesomeService";
})
.Build();