Użyj Orleans z .NET Aspire
Orleans posiada wbudowaną obsługę dla .NET Aspire. model aplikacji .NET.NET Aspireumożliwia opisywanie usług, baz danych i innych zasobów/infrastruktury w aplikacji oraz ich powiązania. Orleans zapewnia prosty sposób tworzenia aplikacji rozproszonych, które są elastycznie skalowalne i odporne na uszkodzenia. .NET Aspire służy do konfigurowania i orkiestracji Orleans oraz jego zależności, na przykład poprzez zapewnianie Orleans członkostwa w klastrze bazy danych oraz przestrzeni magazynowej.
Orleans jest reprezentowana jako zasób w .NET Aspire. Zasób Orleans obejmuje konfigurację, której Twoja usługa potrzebuje do działania, takich jak dostawcy członkostwa w klastrze i dostawcy magazynu.
Warunki wstępne
Aby pracować z .NET.NET Aspire, musisz mieć zainstalowane lokalnie następujące elementy:
- .NET 8.0 lub .NET 9.0
- Środowisko uruchomieniowe kontenera zgodne ze standardem OCI, takie jak:
- Docker Desktop lub Podman. Aby uzyskać więcej informacji, zobacz Container Runtime.
- Zintegrowane środowisko deweloperskie (IDE) lub edytor kodu, takie jak:
- Visual Studio 2022 w wersji 17.9 lub nowszej (opcjonalnie)
-
Visual Studio Code (opcjonalnie)
- C# Dev Kit: Rozszerzenie (opcjonalnie)
- JetBrains Rider z wtyczką .NET.NET Aspire (opcjonalnie)
Aby uzyskać więcej informacji, zobacz .NET.NET Aspire setup and toolingi .NET.NET Aspire SDK.
Oprócz wymagań wstępnych dotyczących .NET.NET Aspirepotrzebne są następujące elementy:
- Orleans w wersji 8.1.0 lub nowszej
Aby uzyskać więcej informacji, zobacz .NET.NET Aspire konfigurację i narzędzia.
Zacznij
Aby rozpocząć, należy dodać pakiet hostingowy Orleans do projektu hosta aplikacji, instalując pakiet NuGet 📦Aspire.Hosting.Orleans.
dotnet add package Aspire.Hosting.Orleans
Aby uzyskać więcej informacji, zobacz dotnet add package lub Zarządzaj zależnościami pakietów w .NET aplikacjach.
Zasób Orleans jest dodawany do konstruktora aplikacji rozproszonych .NET Aspire przy użyciu metody AddOrleans(string name)
, która zwraca konstruktor zasobów Orleans. Nazwa podana dla zasobu Orleans służy do celów diagnostycznych. W przypadku większości aplikacji wystarczy wartość "default"
.
var orleans = builder.AddOrleans("default")
Konstruktor zasobów Orleans oferuje metody konfigurowania zasobu Orleans.
Aby skonfigurować Orleans przy użyciu klasteryzacji i przechowywania danych, zainstaluj pakiet NuGet 📦Aspire.Hostowanie.Azure.Storage w projekcie hosta aplikacji.
dotnet add package Aspire.Hosting.Azure.Storage
W poniższym przykładzie zasób Orleans jest skonfigurowany z klastrowaniem i magazynem ziarna przy użyciu odpowiednio metod WithClustering
i 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);
Powyższy kod informuje Orleans, że każda usługa odwołująca się do niej również musi odwoływać się do zasobu clusteringTable
.
Aby wziąć udział w klastrze Orleans, należy odwołać się do zasobu Orleans z projektu usługi, używając WithReference(orleans)
, aby uczestniczyć jako Orleansserver, lub używając WithReference(orleans.AsClient())
, aby uczestniczyć jako client. W przypadku odwoływania się do zasobu Orleans ze swojej usługi, te zasoby są również przywoływane:
// Add our server project and reference your 'orleans' resource from it.
// it can join the Orleans cluster as a service.
// This implicitly add references to the required resources.
// In this case, that is the 'clusteringTable' resource declared earlier.
builder.AddProject<Projects.OrleansServer>("silo")
.WithReference(orleans)
.WithReplicas(3);
Podsumowując, oto przykład projektu hosta aplikacji .NET.NET Aspire, który obejmuje:
- Zasób Orleans z klastrowaniem i przechowywaniem.
- Projekt Orleansserver, OrleansServer.
- Projekt OrleansclientOrleansClient.
var builder = DistributedApplication.CreateBuilder(args);
// 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);
// Add our server project and reference your 'orleans' resource from it.
// it can join the Orleans cluster as a service.
// This implicitly add references to the required resources.
// In this case, that is the 'clusteringTable' resource declared earlier.
builder.AddProject<Projects.OrleansServer>("silo")
.WithReference(orleans)
.WithReplicas(3);
// 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);
// Build and run the application.
using var app = builder.Build();
await app.RunAsync();
Aby korzystać z zasobu .NET AspireOrleans z projektu Orleansserver, wykonaj kilka kroków:
- Dodaj odpowiednie integracje .NET.NET Aspire. W tym przykładzie używasz Aspire.Azure.Data.Tables i Aspire.Azure.Storage.Blobs.
- Dodaj pakiety dostawców Orleans dla integracji .NET Aspire. W tym przykładzie używasz
Microsoft.Orleans.Persistence.AzureStorage
iMicrosoft.Orleans.Clustering.AzureStorage
. - Dodaj Orleans do konstruktora aplikacji hosta.
W pliku Program.cs projektu Orleansserver należy skonfigurować integracje .NET Aspire używane i dodać Orleans do konstruktora hostów. Podane nazwy muszą być zgodne z nazwami używanymi w projekcie hosta aplikacji .NET.NET Aspire: "clustering" dla dostawcy klastrowania i "grain-state" dla dostawcy magazynu stanu ziarna.
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;
}
}
Podobnie w projekcie OrleansClient dodaj zasoby .NET Aspire, których projekt potrzebuje, aby dołączyć do klastra Orleans jako client, i skonfiguruj konstruktora hosta, aby dodać Orleansclient:
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();
Włączanie OpenTelemetry
Zgodnie z konwencją rozwiązania .NET.NET Aspire obejmują projekt służący do definiowania domyślnej konfiguracji i zachowania usługi. Ten projekt jest nazywany domyślnym projektem usługi ConfigureOpenTelemetry
, aby dodać mierniki Orleans oraz instrumenty śledzenia . Poniższy fragment kodu przedstawia zmodyfikowany plik Extensions.cs z projektu domyślnego usługi, który zawiera metryki i ślady z 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;
}
Obsługiwani dostawcy
Integracja OrleansAspire obsługuje obecnie ograniczony podzestaw dostawców Orleans:
- Klastrowanie:
- Redis
- Tabele składowania Azure
- Wytrwałość:
- Redis
- Tabele składowania Azure
- Bloby magazynowe Azure
- Przypomnienia:
- Redis
- Tabele składowania Azure
- Katalog ziarna:
- Redis
- Tabele składowania Azure
Usługi streamingowe nie są obsługiwane w wersji Orleans 8.1.0.