.NET Aspire Orleans integração
Orleans tem suporte integrado para .NET.NET Aspire. .NET .NET Aspiremodelo de aplicação permite descrever os serviços, bancos de dados e outros recursos e infraestruturas na sua aplicação e como se relacionam. Orleans fornece uma maneira simples de criar aplicativos distribuídos que são elasticamente escaláveis e tolerantes a falhas. Você pode usar .NET Aspire para configurar e orquestrar Orleans e suas dependências, por exemplo, fornecendo à Orleans associação de cluster e armazenamento.
Orleans é representado como um recurso em .NET Aspire. Ao contrário de outras integrações, a integração Orleans não cria um contêiner e não requer um pacote de integração client separado. Em vez disso, você conclui a configuração Orleans no projeto de host do aplicativo .NET Aspire.
Observação
Esta integração requer Orleans versão 8.1.0 ou posterior.
Integração de hospedagem
A integração de hospedagem Orleans modela um serviço Orleans como o tipo OrleansService. Para aceder este tipo e APIs, adicione o pacote NuGet 📦Aspire.Hospedagem.Orleans no projeto de aplicação host .
- .NET CLI
- PackageReference
dotnet add package Aspire.Hosting.Orleans
Para obter mais informações, consulte dotnet add package ou Gerir dependências de pacotes em aplicações .NET.
Adicionar um recurso Orleans
Em seu projeto de host de aplicativo, chame AddOrleans para adicionar e retornar um Orleans construtor de recursos de serviço. O nome fornecido ao recurso Orleans é para fins de diagnóstico. Para a maioria dos aplicativos, um valor de "default"
é suficiente.
var orleans = builder.AddOrleans("default")
Use o armazenamento Azure para agrupar tabelas e armazenar grãos
Em um aplicativo Orleans, o bloco de construção fundamental é um grão. Os grãos podem ter estados duráveis. Você deve armazenar o estado durável para um grão em algum lugar. Em um aplicativo .NET.NET Aspire, Azure Blob Storage é um local possível.
Orleans hosts se registram em um banco de dados e usam esse banco de dados para encontrar uns aos outros e formar um cluster. Eles armazenam quais servidores são membros de quais silos em uma tabela de banco de dados. Você pode usar bancos de dados relacionais ou NoSQL para armazenar essas informações. Em um aplicativo .NET.NET Aspire, uma escolha popular para armazenar esta tabela é Azure Table Storage.
Para configurar Orleans com clustering e armazenamento de grãos em Azure, instale o 📦Aspire.Hospedagem.Azure.Armazenamento pacote NuGet no projeto de hospedagem da aplicação:
- .NET CLI
- PackageReference
dotnet add package Aspire.Hosting.Azure.Storage
No teu projeto de host de aplicação, depois de chamar AddOrleans, configura o recurso Orleans com clustering e armazenamento de grãos usando, respetivamente, os métodos WithClustering e WithGrainStorage.
// Add the resources which you will use for Orleans clustering and
// grain state storage.
var storage = builder.AddAzureStorage("storage").RunAsEmulator();
var clusteringTable = storage.AddTables("clustering");
var grainStorage = storage.AddBlobs("grain-state");
// Add the Orleans resource to the Aspire DistributedApplication
// builder, then configure it with Azure Table Storage for clustering
// and Azure Blob Storage for grain storage.
var orleans = builder.AddOrleans("default")
.WithClustering(clusteringTable)
.WithGrainStorage("Default", grainStorage);
O código anterior informa Orleans que qualquer serviço que faça referência a ele também deve fazer referência ao recurso clusteringTable
.
Adicionar um projeto Orleansserver no host do aplicativo
Agora pode adicionar um novo projeto, inscrito em orquestração .NET Aspire, à sua solução como um Orleansserver. Participará do aglomerado Orleans como um silo com grãos constituintes. Faça referência ao recurso Orleans do seu projeto server usando WithReference(orleans)
. Quando você faz referência ao recurso Orleans do seu serviço, esses recursos também são referenciados:
// Add your server project and reference your 'orleans' resource from it.
// It can join the Orleans cluster as a silo.
// This implicitly adds references to the required resources.
// In this case, that is the 'clusteringTable' resource declared earlier.
builder.AddProject<Projects.OrleansServer>("silo")
.WithReference(orleans)
.WithReplicas(3);
Adicionar um projeto Orleansclient no host do aplicativo
Orleans clientes se comunicam com grãos hospedados em servidores Orleans. Em um aplicativo .NET Aspire, por exemplo, você pode ter um site front-end que chama grãos em um cluster Orleans. Consulte o recurso Orleans do seu Orleansclient usando WithReference(orleans.AsClient())
.
// Reference the Orleans resource as a client from the 'frontend'
// project so that it can connect to the Orleans cluster.
builder.AddProject<Projects.OrleansClient>("frontend")
.WithReference(orleans.AsClient())
.WithExternalHttpEndpoints()
.WithReplicas(3);
Criar o projeto Orleansserver
Agora que o projeto de host do aplicativo foi concluído, você pode implementar o projeto Orleansserver. Vamos começar adicionando os pacotes NuGet necessários:
- .NET CLI
- PackageReference
Na pasta do projeto Orleansserver, execute estes comandos:
dotnet add package Aspire.Azure.Data.Tables
dotnet add package Aspire.Azure.Storage.Blobs
dotnet add package Microsoft.Orleans.Server
dotnet add package Microsoft.Orleans.Persistence.AzureStorage
dotnet add package Microsoft.Orleans.Clustering.AzureStorage
Em seguida, no arquivo Program.cs do seu projeto Orleansserver, adicione os clientes de armazenamento para blob e tabelas Azure e, em seguida, chame UseOrleans.
var builder = WebApplication.CreateBuilder(args);
builder.AddServiceDefaults();
builder.AddKeyedAzureTableClient("clustering");
builder.AddKeyedAzureBlobClient("grain-state");
builder.UseOrleans();
O código a seguir é um exemplo completo de um projeto Orleansserver, incluindo um grão chamado CounterGrain
:
using Orleans.Runtime;
using OrleansContracts;
var builder = WebApplication.CreateBuilder(args);
builder.AddServiceDefaults();
builder.AddKeyedAzureTableClient("clustering");
builder.AddKeyedAzureBlobClient("grain-state");
builder.UseOrleans();
var app = builder.Build();
app.MapGet("/", () => "OK");
await app.RunAsync();
public sealed class CounterGrain(
[PersistentState("count")] IPersistentState<int> count) : ICounterGrain
{
public ValueTask<int> Get()
{
return ValueTask.FromResult(count.State);
}
public async ValueTask<int> Increment()
{
var result = ++count.State;
await count.WriteStateAsync();
return result;
}
}
Criar um projeto Orleansclient
No projeto Orleansclient, adicione os mesmos pacotes NuGet:
- .NET CLI
- PackageReference
dotnet add package Aspire.Azure.Data.Tables
dotnet add package Aspire.Azure.Storage.Blobs
dotnet add package Microsoft.Orleans.Client
dotnet add package Microsoft.Orleans.Persistence.AzureStorage
dotnet add package Microsoft.Orleans.Clustering.AzureStorage
Em seguida, no arquivo Program.cs do seu projeto Orleansclient, adicione o client de armazenamento de tabela Azure e chame UseOrleansClient.
builder.AddKeyedAzureTableClient("clustering");
builder.UseOrleansClient();
O código a seguir é um exemplo completo de um projeto Orleansclient. Ele refere-se ao grão CounterGrain
definido no exemplo Orleansserver acima.
using OrleansContracts;
var builder = WebApplication.CreateBuilder(args);
builder.AddServiceDefaults();
builder.AddKeyedAzureTableClient("clustering");
builder.UseOrleansClient();
var app = builder.Build();
app.MapGet("/counter/{grainId}", async (IClusterClient client, string grainId) =>
{
var grain = client.GetGrain<ICounterGrain>(grainId);
return await grain.Get();
});
app.MapPost("/counter/{grainId}", async (IClusterClient client, string grainId) =>
{
var grain = client.GetGrain<ICounterGrain>(grainId);
return await grain.Increment();
});
app.UseFileServer();
await app.RunAsync();
Habilitando OpenTelemetry
Por convenção, .NET.NET Aspire soluções incluem um projeto para definir a configuração e o comportamento padrão para o seu serviço. Esse projeto é chamado de serviço padrão projeto e os modelos o criam com um nome que termina em ServiceDefaults. Para configurar Orleans para OpenTelemetry no .NET Aspire, aplique a configuração ao seu projeto de padrões do serviço seguindo o guia de observabilidade Orleans.
Modifique o método ConfigureOpenTelemetry
para adicionar os medidores de Orleans e de rastreamento instrumentos. O trecho de código a seguir mostra o arquivo de Extensions.cs modificado de um projeto padrão de serviço que inclui métricas e rastreamentos de Orleans.
public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicationBuilder builder)
{
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
builder.Services.AddOpenTelemetry()
.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddRuntimeInstrumentation()
.AddMeter("Microsoft.Orleans");
})
.WithTracing(tracing =>
{
tracing.AddSource("Microsoft.Orleans.Runtime");
tracing.AddSource("Microsoft.Orleans.Application");
tracing.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation();
});
builder.AddOpenTelemetryExporters();
return builder;
}
Fornecedores suportados
A integração OrleansAspire suporta um subconjunto limitado de provedores de Orleans atualmente:
- Agrupamento:
- Redis
- Azure Tabelas de armazenamento
- Persistência:
- Redis
- Azure Tabelas de armazenamento
- Blobs de armazenamento de dados Azure
- Lembretes:
- Redis
- Azure Tabelas de armazenamento
- Diretório de grãos:
- Redis
- Azure Tabelas de armazenamento
Os provedores de streaming não são suportados a partir de Orleans versão 8.1.0.