.NET Aspire Orleans 集成
Orleans 内置支持 .NET.NET Aspire。 .NET .NET Aspire的应用程序模型允许你描述应用中的服务、数据库和其他资源和基础结构,以及它们彼此之间的关系。 Orleans 提供了一种简单的方法来生成可弹性缩放和容错的分布式应用程序。 可以使用 .NET Aspire 来配置和协调 Orleans 及其依赖项,例如,通过为 Orleans 提供群集成员资格和存储。
Orleans 表示为 .NET Aspire中的资源。 与其他集成不同,Orleans 集成不会创建容器,也不需要单独的客户端集成包。 而是在 Orleans 应用主机项目中完成 .NET Aspire 配置。
注意
此集成需要 Orleans 版本 8.1.0 或更高版本。
托管集成
Orleans 托管集成将 Orleans 服务建模为 OrleansService 类型。 若要访问此类型和 API,请在 📦 项目中添加 AspireOrleans.Hosting. NuGet 包。
dotnet add package Aspire.Hosting.Orleans
有关详细信息,请参阅 dotnet add package 或 在 .NET 应用程序中管理包依赖项。
添加 Orleans 资源
在应用主机项目中,调用 AddOrleans 添加并返回 Orleans 服务资源生成器。 提供给Orleans资源的名称是用于诊断目的。 对于大多数应用程序,"default"
值就足够了。
var orleans = builder.AddOrleans("default")
使用 Azure 存储对表进行群集和粒度数据存储
在 Orleans 应用中,基本构建模块是 grain。 谷物可以具有持久的状态。 必须在某个位置存储粒度的持久状态。 在 .NET.NET Aspire 应用程序中,Azure Blob Storage 是一个可能的位置。
Orleans 主机在数据库中注册自己,并使用该数据库来查找彼此并形成群集。 它们存储哪些服务器是数据库表中哪些孤岛的成员。 可以使用关系数据库或 NoSQL 数据库来存储此信息。 在 .NET.NET Aspire 应用程序中,存储此表的热门选择是 Azure Table Storage。
若要在 Orleans中为 Azure 配置群集和粮食存储,请在应用主机项目中安装 📦Aspire.Hosting.Azure.Storage NuGet 包:
dotnet add package Aspire.Hosting.Azure.Storage
在应用主机项目中,调用 AddOrleans后,使用 Orleans 和 WithClustering 方法分别使用群集和粒度存储配置 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);
前面的代码告知 Orleans 引用它的任何服务也必须引用 clusteringTable
资源。
在应用主机中添加 Orleans 服务器项目
现在,您可以将加入 .NET Aspire 编排的新项目作为 Orleans 服务器添加到您的解决方案中。 它将作为包含成分谷物的孤岛参加 Orleans 群集。 使用 WithReference(orleans)
从服务器项目中引用 Orleans 资源。 当您从服务中引用 Orleans 资源时,这些资源也将被引用:
// 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);
在应用主机中添加 Orleans 客户端项目
Orleans 客户端与 Orleans 服务器上托管的粒度通信。 例如,在 .NET Aspire 应用中,你可能有一个在 Orleans 群集中调用组件的前端网站。 使用 WithReference(orleans.AsClient())
从 Orleans 客户端引用 Orleans 资源。
// 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);
创建 Orleans 服务器项目
完成应用主机项目后,即可实现 Orleans 服务器项目。 首先添加所需的 NuGet 包:
在 Orleans 服务器项目的文件夹中,运行以下命令:
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
接下来,在 Orleans 服务器项目的 Program.cs 文件中,添加 Azure 存储 Blob 和表客户端,然后调用 UseOrleans。
var builder = WebApplication.CreateBuilder(args);
builder.AddServiceDefaults();
builder.AddKeyedAzureTableClient("clustering");
builder.AddKeyedAzureBlobClient("grain-state");
builder.UseOrleans();
以下代码是 Orleans 服务器项目的完整示例,包括名为 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;
}
}
创建 Orleans 客户端项目
在 Orleans 客户端项目中,添加相同的 NuGet 包:
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
接下来,在 Orleans 客户端项目的 Program.cs 文件中,添加 Azure 表存储客户端,然后调用 UseOrleansClient。
builder.AddKeyedAzureTableClient("clustering");
builder.UseOrleansClient();
以下代码是 Orleans 客户端项目的完整示例。 它调用上面 Orleans 服务器示例中定义的 CounterGrain
粒度:
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();
启用 OpenTelemetry
按照约定,.NET.NET Aspire 解决方案包括用于定义服务的默认配置和行为的项目。 此项目称为 服务默认值 项目,模板创建的名称以 ServiceDefaults结尾。 若要在 Orleans中为 OpenTelemetry 配置 .NET Aspire,请遵循 Orleans 可观测性 指南,将配置应用于服务默认项目。
修改 ConfigureOpenTelemetry
方法以添加 Orleans计量 和 跟踪 仪器。 以下代码片段显示了服务默认项目中修改后的 Extensions.cs 文件,其中包括来自 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;
}
支持的提供程序
Orleans Aspire 集成目前支持有限子集 Orleans 提供程序:
- 聚类:
- Redis
- Azure 存储表
- 坚持:
- Redis
- Azure 存储表
- Azure 存储 Blob
- 提醒:
- Redis
- Azure 存储表
- 谷物目录:
- Redis
- Azure 存储表
自 Orleans 版本 8.1.0 开始,不支持流媒体提供商。