integrazione .NET AspireAzure Cosmos DB
Include: integrazione dell'hosting e integrazione di
Client
Azure Cosmos DB è un servizio di database NoSQL completamente gestito per lo sviluppo di app moderne. L'integrazione .NET AspireAzure Cosmos DB consente di connettersi alle istanze di Cosmos DB esistenti o di creare nuove istanze da .NET con l'emulatore di Azure Cosmos DB.
Integrazione dell'hosting
Il .NET.NET AspireAzure Cosmos DB che ospita l'integrazione modella le varie risorse Cosmos DB come i tipi seguenti:
- AzureCosmosDBResource: rappresenta una risorsa di AzureAzure Cosmos DB.
- AzureCosmosDBEmulatorResource: rappresenta una risorsa emulatore di AzureAzure Cosmos DB.
Per accedere a questi tipi e alle API per esprimerli, aggiungere il pacchetto NuGet 📦Aspire.Hosting.Azure.CosmosDB nel progetto host dell'app .
dotnet add package Aspire.Hosting.Azure.CosmosDB
Per ulteriori informazioni, vedere dotnet add package o Gestire le dipendenze dei pacchetti nelle applicazioni .NET.
Aggiungere risorsa AzureAzure Cosmos DB
Nel progetto host della tua app, chiama AddAzureCosmosDB per aggiungere e restituire un generatore di risorse AzureAzure Cosmos DB.
var builder = DistributedApplication.CreateBuilder(args);
var cosmos = builder.AddAzureCosmosDB("cosmos-db");
// After adding all resources, run the app...
Quando si aggiunge un AzureCosmosDBResource all'host dell'app, espone altre API utili per aggiungere database e contenitori. In altre parole, è necessario aggiungere AzureCosmosDBResource
prima di aggiungere qualunque altra risorsa Cosmos DB.
Importante
Quando si chiama AddAzureCosmosDB, si attiva implicitamente AddAzureProvisioning, che aggiunge il supporto per la generazione dinamica di risorse Azure durante l'avvio dell'app. L'app deve configurare la sottoscrizione e la posizione appropriate. Per ulteriori informazioni, consultare Approvisionnement locale: Configurazione.
Bicep di distribuzione generato
Se sei nuovo a Bicep, si tratta di un linguaggio specifico del dominio per la definizione delle risorse Azure. Con .NET.NET Aspirenon è necessario scrivere Bicep a mano, perché le API di provisioning generano Bicep per te automaticamente. Quando pubblichi la tua app, il Bicep generato viene fornito insieme al file manifesto. Quando si aggiunge una risorsa AzureAzure Cosmos DB, viene generato il seguente Bicep:
@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location
param principalType string
param principalId string
resource cosmos 'Microsoft.DocumentDB/databaseAccounts@2024-08-15' = {
name: take('cosmos-${uniqueString(resourceGroup().id)}', 44)
location: location
properties: {
locations: [
{
locationName: location
failoverPriority: 0
}
]
consistencyPolicy: {
defaultConsistencyLevel: 'Session'
}
databaseAccountOfferType: 'Standard'
disableLocalAuth: true
}
kind: 'GlobalDocumentDB'
tags: {
'aspire-resource-name': 'cosmos'
}
}
resource cosmos_roleDefinition 'Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions@2024-08-15' existing = {
name: '00000000-0000-0000-0000-000000000002'
parent: cosmos
}
resource cosmos_roleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2024-08-15' = {
name: guid(principalId, cosmos_roleDefinition.id, cosmos.id)
properties: {
principalId: principalId
roleDefinitionId: cosmos_roleDefinition.id
scope: cosmos.id
}
parent: cosmos
}
output connectionString string = cosmos.properties.documentEndpoint
Il Bicep precedente è un modulo che fornisce un account AzureAzure Cosmos DB con le seguenti impostazioni predefinite:
-
kind
: Il tipo di account Cosmos DB. Il valore predefinito èGlobalDocumentDB
. -
consistencyPolicy
: politica di coerenza dell'account Cosmos DB. Il valore predefinito èSession
. -
locations
: Le posizioni per l'account Cosmos DB. Il valore predefinito è la posizione del gruppo di risorse.
Oltre all'account Cosmos DB, l'applicazione corrente viene aggiunta al ruolo Data Contributor
per l'account Cosmos DB. Il Bicep generato è un punto di partenza e può essere personalizzato per soddisfare i requisiti specifici.
Personalizzare l'infrastruttura di provisioning
Tutte le risorse .NET AspireAzure sono sottoclassi del tipo di AzureProvisioningResource. Questo tipo consente la personalizzazione del Bicep generato fornendo un'API fluente per configurare le risorse Azure, utilizzando l'API ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>). Ad esempio, è possibile configurare il kind
, consistencyPolicy
, locations
e altro ancora. L'esempio seguente illustra come personalizzare la risorsa AzureAzure Cosmos DB:
builder.AddAzureCosmosDB("cosmos-db")
.ConfigureInfrastructure(infra =>
{
var cosmosDbAccount = infra.GetProvisionableResources()
.OfType<CosmosDBAccount>()
.Single();
cosmosDbAccount.Kind = CosmosDBAccountKind.MongoDB;
cosmosDbAccount.ConsistencyPolicy = new()
{
DefaultConsistencyLevel = DefaultConsistencyLevel.Strong,
};
cosmosDbAccount.Tags.Add("ExampleKey", "Example value");
});
Il codice precedente:
- Concatena una chiamata all'API ConfigureInfrastructure:
- Il parametro
infra
è un'istanza del tipo AzureResourceInfrastructure. - Le risorse provisionabili vengono recuperate chiamando il metodo GetProvisionableResources().
- Viene recuperato il CosmosDBAccount singolo.
- Il CosmosDBAccount.ConsistencyPolicy viene assegnato a un DefaultConsistencyLevel.Strong.
- Un tag viene aggiunto all'account Cosmos DB con una chiave di
ExampleKey
e un valore diExample value
.
- Il parametro
Sono disponibili molte altre opzioni di configurazione per personalizzare la risorsa AzureAzure Cosmos DB. Per altre informazioni, vedere Azure.Provisioning.CosmosDB. Per altre informazioni, vedere Azure. Personalizzazione del provisioning.
Connettersi a un account AzureAzure Cosmos DB esistente
Potresti avere un account AzureAzure Cosmos DB esistente a cui collegarti. Anziché rappresentare una nuova risorsa AzureAzure Cosmos DB, è possibile aggiungere una stringa di connessione all'host dell'app. Per aggiungere una connessione a un account esistente di AzureAzure Cosmos DB, utilizzare il metodo AddConnectionString:
var builder = DistributedApplication.CreateBuilder(args);
var cosmos = builder.AddConnectionString("cosmos-db");
builder.AddProject<Projects.WebApplication>("web")
.WithReference(cosmos);
// After adding all resources, run the app...
Nota
Le stringhe di connessione vengono usate per rappresentare un'ampia gamma di informazioni di connessione, tra cui connessioni di database, broker di messaggi, URI degli endpoint e altri servizi. Nella nomenclatura .NET.NET Aspire, il termine "stringa di connessione" si usa per indicare qualsiasi tipo di informazioni di connessione.
La stringa di connessione viene configurata nella configurazione dell'host dell'app, in genere in segreti utente, nella sezione ConnectionStrings
. L'host dell'app inserisce questa stringa di connessione come variabile di ambiente in tutte le risorse dipendenti, ad esempio:
{
"ConnectionStrings": {
"cosmos-db": "AccountEndpoint=https://{account_name}.documents.azure.com:443/;AccountKey={account_key};"
}
}
La risorsa dipendente può accedere alla stringa di connessione inserita chiamando il metodo GetConnectionString e passando il nome della connessione come parametro, in questo caso "cosmos-db"
. L'API GetConnectionString
è un'abbreviazione di IConfiguration.GetSection("ConnectionStrings")[name]
.
Aggiungere AzureAzure Cosmos DB risorse di database e contenitori
Per aggiungere una risorsa di database AzureAzure Cosmos DB, chiamare il metodo AddCosmosDatabase in un'istanza di IResourceBuilder<AzureCosmosDBResource>
:
var builder = DistributedApplication.CreateBuilder(args);
var cosmos = builder.AddAzureCosmosDB("cosmos-db");
cosmos.AddCosmosDatabase("db");
// After adding all resources, run the app...
Quando si chiama AddCosmosDatabase
, aggiunge un database denominato db
alle risorse Cosmos DB e restituisce la risorsa di database appena creata. Il database viene creato nell'account Cosmos DB, che è rappresentato dal AzureCosmosDBResource
che hai aggiunto in precedenza. Il database è un contenitore logico per raccolte e utenti.
Un contenitore AzureAzure Cosmos DB è la posizione in cui vengono archiviati i dati. Quando si crea un contenitore, è necessario specificare una chiave di partizione.
Per aggiungere una risorsa contenitore AzureAzure Cosmos DB, chiamare il metodo AddContainer in un'istanza di IResourceBuilder<AzureCosmosDBDatabaseResource>
:
var builder = DistributedApplication.CreateBuilder(args);
var cosmos = builder.AddAzureCosmosDB("cosmos-db");
var db = cosmos.AddCosmosDatabase("db");
db.AddContainer("entries", "/id");
// After adding all resources, run the app...
Il contenitore viene creato nel database rappresentato dal AzureCosmosDBDatabaseResource
aggiunto in precedenza.
Per altre informazioni, vedere Database, contenitori ed elementi in AzureAzure Cosmos DB.
Aggiungere una risorsa emulatore AzureAzure Cosmos DB
Per aggiungere una risorsa dell'emulatore AzureAzure Cosmos DB, concatenare una chiamata a un IResourceBuilder<AzureCosmosDBResource>
all'API RunAsEmulator:
var builder = DistributedApplication.CreateBuilder(args);
var cosmos = builder.AddAzureCosmosDB("cosmos-db")
.RunAsEmulator();
// After adding all resources, run the app...
Quando si chiama RunAsEmulator
, configura le risorse Cosmos DB per l'esecuzione in locale tramite un emulatore. L'emulatore in questo caso è il AzureAzure Cosmos DB Emulatore. L'emulatore Azure Cosmos DB offre un ambiente locale gratuito per testare le app Azure Cosmos DB ed è un perfetto compagno all'integrazione dell'hosting .NET AspireAzure. L'emulatore non è installato, ma è accessibile per .NET.NET Aspire come contenitore. Quando si aggiunge un contenitore all'host dell'applicazione, come mostrato nell'esempio precedente con l'immagine mcr.microsoft.com/cosmosdb/emulator
, il contenitore viene creato e avviato all'avvio dell'host dell'applicazione. Per ulteriori informazioni, vedere il ciclo di vita delle risorse del contenitore.
Configurare il contenitore dell'emulatore Cosmos DB
Sono disponibili varie configurazioni per le risorse del contenitore, ad esempio è possibile configurare le porte del contenitore, le variabili di ambiente, la durata e altro ancora.
Configurare la porta del gateway del contenitore dell'emulatore Cosmos DB
Per impostazione predefinita, il contenitore dell'emulatore Cosmos DB quando configurato da .NET Aspireespone gli endpoint seguenti:
Punto di Accesso | Porta contenitore | Porta host |
---|---|---|
https |
8081 | dinamico |
La porta su cui è in ascolto è dinamica per impostazione predefinita. All'avvio del contenitore, la porta viene mappata a una porta casuale sulla macchina host. Per configurare la porta dell'endpoint, concatenare le chiamate al generatore di risorse del contenitore fornito dal metodo RunAsEmulator
, come illustrato nell'esempio seguente:
var builder = DistributedApplication.CreateBuilder(args);
var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
emulator =>
{
emulator.WithGatewayPort(7777);
});
// After adding all resources, run the app...
Il codice precedente configura l'endpoint Cosmos DB esistente del contenitore dell'emulatore di https
per l'ascolto sulla porta 8081
. La porta del contenitore dell'emulatore Cosmos DB viene mappata alla porta host, come illustrato nella tabella seguente:
Nome del punto finale | Mappatura delle porte (container:host ) |
---|---|
https |
8081:7777 |
Configurare il contenitore dell'emulatore Cosmos DB con una durata permanente
Per configurare il contenitore dell'emulatore Cosmos DB con una durata permanente, chiamare il metodo WithLifetime nella risorsa contenitore dell'emulatore Cosmos DB e passare ContainerLifetime.Persistent:
var builder = DistributedApplication.CreateBuilder(args);
var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
emulator =>
{
emulator.WithLifetime(ContainerLifetime.Persistent);
});
// After adding all resources, run the app...
Per ulteriori informazioni, vedere durata delle risorse del contenitore.
Configurare il contenitore emulatore Cosmos DB con volume di dati
Per aggiungere un volume di dati alla risorsa dell'emulatore AzureAzure Cosmos DB, chiamare il metodo WithDataVolume nella risorsa dell'emulatore AzureAzure Cosmos DB:
var builder = DistributedApplication.CreateBuilder(args);
var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
emulator =>
{
emulator.WithDataVolume();
});
// After adding all resources, run the app...
Il volume di dati viene usato per rendere persistenti i dati dell'emulatore Cosmos DB al di fuori del ciclo di vita del contenitore. Il volume di dati viene montato nel percorso /tmp/cosmos/appdata
nel contenitore dell'emulatore Cosmos DB e quando non viene specificato un parametro name
, viene generato il nome. L'emulatore ha la variabile di ambiente AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE
impostata su true
. Per ulteriori informazioni sui volumi di dati e sui motivi per cui sono preferiti rispetto ai "bind mounts", consultare la documentazione: VolumiDocker.
Configurare il numero di partizioni del contenitore dell'emulatore Cosmos DB
Per configurare il numero di partizioni del contenitore dell'emulatore Cosmos DB, chiamare il metodo WithPartitionCount:
var builder = DistributedApplication.CreateBuilder(args);
var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
emulator =>
{
emulator.WithPartitionCount(100); // Defaults to 25
});
// After adding all resources, run the app...
Il codice precedente configura il contenitore dell'emulatore Cosmos DB in modo che abbia un numero di partizioni di 100
. Si tratta di una sintassi abbreviata per impostare la variabile di ambiente AZURE_COSMOS_EMULATOR_PARTITION_COUNT
.
Usare l'emulatore basato su Linux(anteprima)
La nuova generazione dell'emulatore AzureAzure Cosmos DB è interamente basata su Linuxed è disponibile come contenitore Docker. Supporta l'esecuzione su un'ampia gamma di processori e sistemi operativi.
Per usare la versione di anteprima dell'emulatore Cosmos DB, chiamare il metodo RunAsPreviewEmulator. Poiché questa funzionalità è in anteprima, è necessario acconsentire esplicitamente alla funzionalità di anteprima eliminando la diagnostica sperimentale ASPIRECOSMOSDB001
.
L'emulatore di anteprima supporta anche l'esposizione di un endpoint "Esplora dati" che consente di visualizzare i dati archiviati nell'emulatore di Cosmos DB tramite un'interfaccia utente Web. Per abilitare Esplora dati, chiamare il metodo WithDataExplorer.
#pragma warning disable ASPIRECOSMOSDB001
var builder = DistributedApplication.CreateBuilder(args);
var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsPreviewEmulator(
emulator =>
{
emulator.WithDataExplorer();
});
// After adding all resources, run the app...
Il codice precedente configura il contenitore dell'emulatore basato su LinuxCosmos DB, con l'endpoint Data Explorer, da usare in fase di esecuzione.
Verifica dello stato di integrazione dell'hosting
L'integrazione dell'hosting Azure Cosmos DB aggiunge automaticamente una verifica dello stato di salute per la risorsa Cosmos DB. Il controllo di integrità verifica che il Cosmos DB sia in esecuzione e che sia possibile stabilire una connessione.
L'integrazione dell'hosting si basa sul pacchetto NuGet 📦 AspNetCore.HealthChecks.CosmosDb.
integrazione Client
Per iniziare a utilizzare l'integrazione del client .NET AspireAzure Cosmos DB, installare il pacchetto NuGet 📦Aspire.Microsoft.Azure.Cosmos nel progetto client-consumer, cioè il progetto relativo all'applicazione che utilizza il client Cosmos DB. L'integrazione client Cosmos DB registra un'istanza di CosmosClient che è possibile usare per interagire con Cosmos DB.
dotnet add package Aspire.Microsoft.Azure.Cosmos
Aggiungere Cosmos DB client
Nel file Program.cs del progetto che usa il client, chiamare il metodo di estensione AddAzureCosmosClient su qualsiasi IHostApplicationBuilder per registrare un CosmosClient da usare tramite il contenitore di iniezione delle dipendenze. Il metodo accetta un parametro del nome di connessione.
builder.AddAzureCosmosClient(connectionName: "cosmos-db");
Suggerimento
Il parametro connectionName
deve corrispondere al nome usato quando si aggiunge la risorsa Cosmos DB nel progetto host dell'app. In altre parole, quando si chiama AddAzureCosmosDB
e si specifica un nome di cosmos-db
lo stesso nome deve essere usato quando si chiama AddAzureCosmosClient
. Per altre informazioni, vedere Aggiungere AzureAzure Cosmos DB risorsa.
È quindi possibile recuperare l'istanza di CosmosClient usando l'iniezione di dipendenze. Ad esempio, per recuperare la connessione da un servizio di esempio:
public class ExampleService(CosmosClient client)
{
// Use client...
}
Per altre informazioni sull'inserimento delle dipendenze, vedere .NET 'inserimento delle dipendenze.
Aggiungere un cliente con chiave Cosmos DB
In alcuni casi potrebbe essere necessario registrare più istanze di CosmosClient
con nomi di connessione diversi. Per registrare i client Cosmos DB con chiave, chiamare il metodo AddKeyedAzureCosmosClient:
builder.AddKeyedAzureCosmosClient(name: "mainDb");
builder.AddKeyedAzureCosmosClient(name: "loggingDb");
Importante
Quando si usano i servizi con chiave, è previsto che la risorsa Cosmos DB sia configurata con due database denominati, uno per il mainDb
e uno per l'loggingDb
.
È quindi possibile recuperare le istanze di CosmosClient
mediante dependency injection. Ad esempio, per recuperare la connessione da un servizio di esempio:
public class ExampleService(
[FromKeyedServices("mainDb")] CosmosClient mainDbClient,
[FromKeyedServices("loggingDb")] CosmosClient loggingDbClient)
{
// Use clients...
}
Per ulteriori informazioni sui servizi con chiave, vedere .NET iniezione di dipendenze: servizi con chiave.
Configurazione
L'integrazione .NET AspireAzure Cosmos DB offre più opzioni per configurare la connessione in base ai requisiti e alle convenzioni del progetto.
Usare una stringa di connessione
Quando si usa una stringa di connessione dalla sezione di configurazione ConnectionStrings
, è possibile specificare il nome della stringa di connessione quando si chiama il metodo AddAzureCosmosClient:
builder.AddAzureCosmosClient("cosmos-db");
La stringa di connessione viene quindi recuperata dalla sezione di configurazione ConnectionStrings
:
{
"ConnectionStrings": {
"cosmos-db": "AccountEndpoint=https://{account_name}.documents.azure.com:443/;AccountKey={account_key};"
}
}
Per altre informazioni su come formattare questa stringa di connessione, vedere la documentazione di ConnectionString.
Usare i fornitori di configurazione
L'integrazione .NET AspireAzure Cosmos DB supporta Microsoft.Extensions.Configuration. Carica il MicrosoftAzureCosmosSettings dalla configurazione utilizzando la chiave Aspire:Microsoft:Azure:Cosmos
. Il frammento di codice seguente è un esempio di un file appsettings.json che configura alcune delle opzioni:
{
"Aspire": {
"Microsoft": {
"Azure": {
"Cosmos": {
"DisableTracing": false,
}
}
}
}
}
Per lo schema completo di integrazione del client Cosmos DBJSON, vedere Aspire.Microsoft.Azure.Cosmos/ConfigurationSchema.json.
Usare delegati in linea
Puoi anche passare il delegato Action<MicrosoftAzureCosmosSettings> configureSettings
per configurare alcune o tutte le opzioni in linea, ad esempio per disabilitare il tracciamento dal codice:
builder.AddAzureCosmosClient(
"cosmos-db",
static settings => settings.DisableTracing = true);
È anche possibile configurare il Microsoft.Azure.Cosmos.CosmosClientOptions usando il parametro facoltativo Action<CosmosClientOptions> configureClientOptions
del metodo AddAzureCosmosClient
. Ad esempio, per impostare il suffisso CosmosClientOptions.ApplicationName dell'intestazione dell'utente-agente per tutte le richieste effettuate da questo client:
builder.AddAzureCosmosClient(
"cosmosConnectionName",
configureClientOptions:
clientOptions => clientOptions.ApplicationName = "myapp");
Client verifiche di integrità dell'integrazione
L'integrazione client .NET AspireCosmos DB attualmente non implementa i controlli di integrità, anche se questo potrebbe cambiare nelle versioni future.
Osservabilità e telemetria
.NET
.NET Aspire le integrazioni configurano automaticamente la registrazione, il tracciamento e le metriche, talvolta noti come i pilastri dell'osservabilità. Per altre informazioni sull'osservabilità e la telemetria dell'integrazione, vedere panoramica delle integrazioni .NET.NET Aspire. A seconda del servizio di backup, alcune integrazioni possono supportare solo alcune di queste funzionalità. Ad esempio, alcune integrazioni supportano la registrazione e la traccia, ma non le metriche. Le funzionalità di telemetria possono essere disabilitate anche usando le tecniche presentate nella sezione Configurazione
Registrazione
L'integrazione .NET AspireAzure Cosmos DB usa le categorie di log seguenti:
Azure-Cosmos-Operation-Request-Diagnostics
Oltre a ottenere la diagnostica delle richieste Azure Cosmos DB per le richieste non riuscite, è possibile configurare le soglie di latenza per determinare quale diagnostica delle richieste riuscite Azure Cosmos DB verrà registrata correttamente. I valori predefiniti sono 100 ms per le operazioni punto e 500 ms per le operazioni non di punto.
builder.AddAzureCosmosClient(
"cosmosConnectionName",
configureClientOptions:
clientOptions => {
clientOptions.CosmosClientTelemetryOptions = new()
{
CosmosThresholdOptions = new()
{
PointOperationLatencyThreshold = TimeSpan.FromMilliseconds(50),
NonPointOperationLatencyThreshold = TimeSpan.FromMilliseconds(300)
}
};
});
Tracciamento
L'integrazione .NET AspireAzure Cosmos DB genererà le attività di traccia seguenti usando OpenTelemetry:
Azure.Cosmos.Operation
Il tracciamento AzureAzure Cosmos DB è attualmente in anteprima, pertanto è necessario impostare l'interruttore sperimentale per assicurarsi che le tracce vengano emesse.
AppContext.SetSwitch("Azure.Experimental.EnableActivitySource", true);
Per altre informazioni, vedere AzureAzure Cosmos DB SDK osservabilità: attributi di traccia.
Metriche
L'integrazione .NET AspireAzure Cosmos DB attualmente non supporta le metriche per impostazione predefinita a causa di limitazioni con Azure SDK.
Vedere anche
- Azure Cosmos DB
- .NET Aspire Cosmos DB Entity Framework Core integrazione
- Panoramica integrazioni .NET.NET Aspire
- Panoramica integrazioni .NET AspireAzure
- .NET Aspire GitHub repository