integracja .NET AspireAzurePostgreSQL
obejmuje: integracja hostingu oraz integracja
Client
Azure Database for PostgreSQL— elastyczny Server to usługa relacyjnej bazy danych oparta na open-source'owym silniku bazy danych Postgres. Jest to w pełni zarządzana baza danych jako usługa, która może obsługiwać obciążenia o krytycznym znaczeniu z przewidywalną wydajnością, zabezpieczeniami, wysoką dostępnością i dynamiczną skalowalnością. Integracja .NET AspireAzurePostgreSQL umożliwia łączenie się z istniejącymi bazami danych AzurePostgreSQL lub tworzenie nowych wystąpień z .NET przy użyciu obrazu kontenera docker.io/library/postgres
.
Integracja hostingu
.NET Aspire Azure PostgreSQL integracja hostowania modeluje PostgreSQL elastyczny serwer i bazę danych jako typy AzurePostgresFlexibleServerResource i AzurePostgresFlexibleServerDatabaseResource. Inne typy, które są z natury dostępne w integracji hostingu, są reprezentowane w następujących zasobach:
Aby uzyskać dostęp do tych typów i interfejsów API w celu wyrażenia ich jako zasobów w projekcie hosta aplikacji , zainstaluj pakiet 📦Aspire.Hosting.Azure.PostgreSQL NuGet.
dotnet add package Aspire.Hosting.Azure.PostgreSQL
Więcej informacji znajdziesz w dotnet add package.
Integracja hostowania AzurePostgreSQL zależy od pakietu NuGet 📦Aspire.Hosting.PostgreSQL, rozszerzając go w celu obsługi Azure. Wszystko, co można zrobić za pomocą integracji .NET AspirePostgreSQL i integracji .NET AspirePostgreSQLEntity Framework Core można również wykonać z tą integracją.
Dodawanie zasobu serwera AzurePostgreSQL
Po zainstalowaniu integracji hostingu .NET AspireAzurePostgreSQL wywołaj metodę rozszerzenia AddAzurePostgresFlexibleServer w projekcie hostującym aplikację.
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddAzurePostgresFlexibleServer("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
Poprzednie wywołanie AddAzurePostgresFlexibleServer
konfiguruje zasób serwera PostgreSQL do wdrożenia jako elastyczny AzurePostgresServer.
Ważny
Domyślnie AddAzurePostgresFlexibleServer
konfiguruje uwierzytelnianie Identyfikator entra firmy Microsoft. Wymaga to zmian w aplikacjach, które muszą łączyć się z tymi zasobami. Aby uzyskać więcej informacji, zobacz Client integration.
Napiwek
Podczas wywołania AddAzurePostgresFlexibleServernastępuje również niejawne wywołanie AddAzureProvisioning, co dodaje możliwość dynamicznego generowania zasobów Azure podczas uruchamiania aplikacji. Aplikacja musi skonfigurować odpowiednią subskrypcję i lokalizację. Aby uzyskać więcej informacji, zobacz Lokalna konfiguracja: Konfiguracja.
Wygenerowane prowizjonowanie Bicep
Jeśli dopiero zaczynasz z Bicep, to jest język specyficzny dla domeny służący do definiowania zasobów Azure. W przypadku .NET.NET Aspirenie musisz pisać Bicep ręcznie, zamiast tego interfejsy API aprowizacji generują Bicep. Podczas publikowania aplikacji wygenerowany Bicep jest wyświetlany wraz z plikiem manifestu. Po dodaniu zasobu AzurePostgreSQL zostanie wygenerowany następujący Bicep:
przełącz AzurePostgreSQL Biceps.
@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location
param principalId string
param principalType string
param principalName string
resource postgres_flexible 'Microsoft.DBforPostgreSQL/flexibleServers@2024-08-01' = {
name: take('postgresflexible-${uniqueString(resourceGroup().id)}', 63)
location: location
properties: {
authConfig: {
activeDirectoryAuth: 'Enabled'
passwordAuth: 'Disabled'
}
availabilityZone: '1'
backup: {
backupRetentionDays: 7
geoRedundantBackup: 'Disabled'
}
highAvailability: {
mode: 'Disabled'
}
storage: {
storageSizeGB: 32
}
version: '16'
}
sku: {
name: 'Standard_B1ms'
tier: 'Burstable'
}
tags: {
'aspire-resource-name': 'postgres-flexible'
}
}
resource postgreSqlFirewallRule_AllowAllAzureIps 'Microsoft.DBforPostgreSQL/flexibleServers/firewallRules@2024-08-01' = {
name: 'AllowAllAzureIps'
properties: {
endIpAddress: '0.0.0.0'
startIpAddress: '0.0.0.0'
}
parent: postgres_flexible
}
resource postgres_flexible_admin 'Microsoft.DBforPostgreSQL/flexibleServers/administrators@2024-08-01' = {
name: principalId
properties: {
principalName: principalName
principalType: principalType
}
parent: postgres_flexible
dependsOn: [
postgres_flexible
postgreSqlFirewallRule_AllowAllAzureIps
]
}
output connectionString string = 'Host=${postgres_flexible.properties.fullyQualifiedDomainName};Username=${principalName}'
Poprzedni Bicep jest modułem, który konfiguruje elastyczny serwer AzurePostgreSQL z następującymi wartościami domyślnymi:
-
authConfig
: konfiguracja uwierzytelniania serwera PostgreSQL. Wartość domyślna toActiveDirectoryAuth
włączona iPasswordAuth
wyłączona. -
availabilityZone
: strefa dostępności serwera PostgreSQL. Wartość domyślna to1
. -
backup
: konfiguracja kopii zapasowej serwera PostgreSQL. Wartość domyślna toBackupRetentionDays
ustawiona na7
iGeoRedundantBackup
ustawiona na wartośćDisabled
. -
highAvailability
: konfiguracja wysokiej dostępności serwera PostgreSQL. Wartość domyślna toDisabled
. -
storage
: konfiguracja pamięci masowej serwera PostgreSQL. Wartość domyślna toStorageSizeGB
ustawiona na wartość32
. -
version
: wersja serwera PostgreSQL. Wartość domyślna to16
. -
sku
: jednostka SKU serwera PostgreSQL. Wartość domyślna toStandard_B1ms
. -
tags
: tagi serwera PostgreSQL. Wartość domyślna toaspire-resource-name
ustawiona na nazwę zasobu Aspire, w tym przypadkupostgres-flexible
.
Oprócz elastycznego serwera PostgreSQL, konfiguruje również regułę zapory Azure, która zezwala na wszystkie adresy IP Azure. Na koniec dla serwera PostgreSQL jest tworzony administrator, a parametry połączenia są zwracane jako zmienna wyjściowa. Wygenerowany Bicep jest punktem wyjścia i można go dostosować, aby spełnić określone wymagania.
Dostosowywanie infrastruktury aprowizacji
Wszystkie zasoby .NET AspireAzure to podklasy typu AzureProvisioningResource. Ten typ umożliwia dostosowanie wygenerowanego pliku Bicep poprzez zapewnienie płynnego interfejsu API do konfigurowania zasobów Azure przy użyciu interfejsu API ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>). Można na przykład skonfigurować kind
, consistencyPolicy
, locations
i więcej. W poniższym przykładzie pokazano, jak dostosować zasób AzureAzure Cosmos DB:
builder.AddAzureCosmosDB("cosmos-db")
.ConfigureInfrastructure(infra =>
{
var flexibleServer = infra.GetProvisionableResources()
.OfType<PostgreSqlFlexibleServer>()
.Single();
flexibleServer.Sku = new PostgreSqlFlexibleServerSku
{
Tier = PostgreSqlFlexibleServerSkuTier.Burstable,
};
flexibleServer.HighAvailability = new PostgreSqlFlexibleServerHighAvailability
{
Mode = PostgreSqlFlexibleServerHighAvailabilityMode.ZoneRedundant,
StandbyAvailabilityZone = "2",
};
flexibleServer.Tags.Add("ExampleKey", "Example value");
});
Powyższy kod:
- Łańcuch wywołania interfejsu API ConfigureInfrastructure:
- Parametr
infra
jest wystąpieniem typu AzureResourceInfrastructure. - Zasoby możliwe do aprowizacji są pobierane przez wywołanie metody GetProvisionableResources().
- Pobierana jest pojedyncza PostgreSqlFlexibleServer.
-
sku
jest ustawiana przy użyciu PostgreSqlFlexibleServerSkuTier.Burstable. - Właściwości wysokiej dostępności są ustawiane za pomocą PostgreSqlFlexibleServerHighAvailabilityMode.ZoneRedundant w zapasowej strefie dostępności
"2"
. - Do elastycznego serwera dodawany jest tag z kluczem
ExampleKey
i wartościąExample value
.
- Parametr
Dostępnych jest wiele opcji konfiguracji umożliwiających dostosowanie PostgreSQL zasobu serwera elastycznego. Aby uzyskać więcej informacji, zobacz Azure.Provisioning.PostgreSql. Aby uzyskać więcej informacji, zobacz Azure. Dostosowywanie aprowizacji.
Nawiąż połączenie z istniejącym serwerem elastycznym AzurePostgreSQL
Być może masz istniejący serwer elastyczny AzurePostgreSQL, z którym chcesz nawiązać połączenie. Zamiast reprezentować nowy zasób serwera elastycznego AzurePostgreSQL, można dodać ciąg połączenia do hosta aplikacji. Aby dodać połączenie z istniejącym serwerem elastycznym AzurePostgreSQL, wywołaj metodę AddConnectionString:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddConnectionString("postgres");
builder.AddProject<Projects.WebApplication>("web")
.WithReference(postgres);
// After adding all resources, run the app...
Notatka
Parametry połączenia służą do reprezentowania szerokiego zakresu informacji o połączeniu, w tym połączeń z bazą danych, brokerów komunikatów, identyfikatorów URI punktów końcowych i innych usług. W .NET.NET Aspire nomenklaturze termin "parametry połączenia" służy do reprezentowania wszelkich informacji o połączeniu.
Parametry połączenia są konfigurowane w konfiguracji hosta aplikacji, zazwyczaj w obszarze Wpisy tajne użytkownikaw sekcji ConnectionStrings
. Host aplikacji wprowadza te parametry połączenia jako zmienną środowiskową do wszystkich zasobów zależnych, na przykład:
{
"ConnectionStrings": {
"postgres": "Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;"
}
}
Zasób zależny może uzyskać dostęp do wstrzykiwanych parametrów połączenia, wywołując metodę GetConnectionString i przekazując nazwę połączenia jako parametr, w tym przypadku "postgres"
. Interfejs API GetConnectionString
jest skrótem od IConfiguration.GetSection("ConnectionStrings")[name]
.
Uruchamianie zasobu AzurePostgreSQL jako kontenera
Integracja hostowania AzurePostgreSQL obsługuje uruchamianie serwera PostgreSQL jako kontenera lokalnego. Jest to korzystne w sytuacjach, w których chcesz uruchomić serwer PostgreSQL lokalnie na potrzeby programowania i testowania, unikając konieczności aprowizacji zasobu Azure lub nawiązywania połączenia z istniejącym serwerem AzurePostgreSQL.
Aby uruchomić serwer PostgreSQL jako kontener, wywołaj metodę RunAsContainer:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddAzurePostgresFlexibleServer("postgres")
.RunAsContainer();
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
Powyższy kod konfiguruje zasób AzurePostgreSQL Elastyczny Server do uruchamiania lokalnego w kontenerze.
Napiwek
Metoda RunAsContainer
jest przydatna w przypadku lokalnego programowania i testowania. Interfejs API uwidacznia opcjonalny delegat, który umożliwia dostosowanie podstawowej konfiguracji PostgresServerResource, takich jak dodanie narzędzia pgAdmin, pgWeb, dodanie woluminu danych lub instalacji powiązania danych i dodanie instalacji powiązania init. Aby uzyskać więcej informacji, zobacz sekcję .NET AspirePostgreSQL integracji hostingu.
Konfigurowanie serwera AzurePostgreSQL do korzystania z uwierzytelniania haseł
Domyślnie serwer AzurePostgreSQL jest skonfigurowany do używania uwierzytelniania Microsoft Entra ID. Jeśli chcesz użyć uwierzytelniania za pomocą hasła, możesz skonfigurować serwer do korzystania z uwierzytelniania haseł, wywołując metodę WithPasswordAuthentication:
var builder = DistributedApplication.CreateBuilder(args);
var username = builder.AddParameter("username", secret: true);
var password = builder.AddParameter("password", secret: true);
var postgres = builder.AddAzurePostgresFlexibleServer("postgres")
.WithPasswordAuthentication(username, password);
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
Powyższy kod konfiguruje serwer AzurePostgreSQL do korzystania z uwierzytelniania haseł. Parametry username
i password
są dodawane do hosta aplikacji jako parametry, a metoda WithPasswordAuthentication
jest wywoływana w celu skonfigurowania serwera AzurePostgreSQL do używania uwierzytelniania haseł. Aby uzyskać więcej informacji, zobacz Parametry zewnętrzne.
integracja Client
Aby rozpocząć pracę z integracją klienta .NET AspirePostgreSQL, zainstaluj pakiet NuGet 📦Aspire.Npgsql w projekcie wykorzystującym klienta, czyli w projekcie aplikacji korzystającej z klienta PostgreSQL. Integracja klienta PostgreSQL rejestruje instancję NpgsqlDataSource, którą można użyć do interakcji z PostgreSQL.
dotnet add package Aspire.Npgsql
Dodawanie klienta npgsql
W pliku Program.cs projektu wykorzystującego klienta wywołaj metodę rozszerzenia AddNpgsqlDataSource na dowolnym IHostApplicationBuilder, aby zarejestrować NpgsqlDataSource
do użycia przy użyciu kontenera wstrzykiwania zależności. Metoda przyjmuje parametr nazwy połączenia.
builder.AddNpgsqlDataSource(connectionName: "postgresdb");
Napiwek
Parametr connectionName
musi być zgodny z nazwą używaną podczas dodawania zasobu serwera PostgreSQL w projekcie hosta aplikacji. Aby uzyskać więcej informacji, zobacz Add PostgreSQL server resource.
Po dodaniu NpgsqlDataSource
do konstruktora można pobrać wystąpienie NpgsqlDataSource
przy użyciu wstrzykiwania zależności. Na przykład aby pobrać obiekt źródła danych z przykładowej usługi, zdefiniuj go jako parametr konstruktora i upewnij się, że klasa ExampleService
jest zarejestrowana w kontenerze iniekcji zależności:
public class ExampleService(NpgsqlDataSource dataSource)
{
// Use dataSource...
}
Aby uzyskać więcej informacji na temat wstrzykiwania zależności, zobacz .NET wstrzykiwanie zależności.
Dodaj zabezpieczony kluczem klient Npgsql
Mogą wystąpić sytuacje, w których chcesz zarejestrować wiele wystąpień NpgsqlDataSource
z różnymi nazwami połączeń. Aby zarejestrować kluczy klientów Npgsql, wywołaj metodę AddKeyedNpgsqlDataSource:
builder.AddKeyedNpgsqlDataSource(name: "chat");
builder.AddKeyedNpgsqlDataSource(name: "queue");
Następnie można uzyskać wystąpienia NpgsqlDataSource
, korzystając z wstrzykiwania zależności. Aby na przykład pobrać połączenie z przykładowej usługi:
public class ExampleService(
[FromKeyedServices("chat")] NpgsqlDataSource chatDataSource,
[FromKeyedServices("queue")] NpgsqlDataSource queueDataSource)
{
// Use data sources...
}
Aby uzyskać więcej informacji na temat usług z kluczami, zobacz .NET wstrzykiwanie zależności: usługi z kluczami.
Konfiguracja
Integracja .NET AspirePostgreSQL zapewnia wiele metod konfiguracji i opcji spełniających wymagania i konwencje projektu.
Używanie parametrów połączenia
W przypadku używania parametrów połączenia z sekcji konfiguracji ConnectionStrings
podczas wywoływania metody AddNpgsqlDataSource można podać nazwę parametrów połączenia:
builder.AddNpgsqlDataSource("postgresdb");
Następnie parametry połączenia zostaną pobrane z sekcji konfiguracji ConnectionStrings
:
{
"ConnectionStrings": {
"postgresdb": "Host=myserver;Database=postgresdb"
}
}
Aby uzyskać więcej informacji, zobacz ConnectionString.
Korzystanie z dostawców konfiguracji
Integracja .NET AspirePostgreSQL obsługuje Microsoft.Extensions.Configuration. Ładuje NpgsqlSettings z appsettings.json lub innych plików konfiguracji przy użyciu klucza Aspire:Npgsql
. Przykład appsettings.json, który konfiguruje niektóre opcje:
W poniższym przykładzie przedstawiono plik appsettings.json, który konfiguruje niektóre z dostępnych opcji:
{
"Aspire": {
"Npgsql": {
"ConnectionString": "Host=myserver;Database=postgresdb",
"DisableHealthChecks": false,
"DisableTracing": true,
"DisableMetrics": false
}
}
}
Aby uzyskać pełny schemat integracji klienta PostgreSQLJSON, zobacz Aspire. Npgsql/ConfigurationSchema.json.
Używaj delegatów wbudowanych
Możesz również przekazać delegata Action<NpgsqlSettings> configureSettings
, aby skonfigurować niektóre lub wszystkie opcje bezpośrednio, na przykład w celu wyłączenia sprawdzania stanu zdrowia.
builder.AddNpgsqlDataSource(
"postgresdb",
static settings => settings.DisableHealthChecks = true);
Kontrole kondycji
Domyślnie integracje .NET.NET Aspire umożliwiają monitorowanie kondycji dla wszystkich usług. Aby uzyskać więcej informacji, zobacz omówienie integracji .NET.NET Aspire.
- Dodaje
NpgSqlHealthCheck
, który sprawdza, czy polecenia można pomyślnie wykonać względem bazowej bazy danych Postgres. - Integruje się z punktem końcowym HTTP
/health
, który wymaga, aby wszystkie zarejestrowane kontrole zdrowotności zostały pomyślnie zakończone, aby aplikacja została uznana za gotową do akceptowania ruchu.
Obserwowanie i telemetria
.NET .NET Aspire integracje automatycznie ustanawiają konfiguracje rejestrowania, śledzenia i metryk, które są czasami nazywane filarami obserwowalności. Aby uzyskać więcej informacji na temat możliwości obserwacji integracji i telemetrii, zobacz omówienie integracji .NET.NET Aspire. W zależności od usługi pomocniczej niektóre integracje mogą obsługiwać tylko niektóre z tych funkcji. Na przykład niektóre integracje obsługują rejestrowanie i śledzenie, ale nie metryki. Funkcje telemetrii można również wyłączyć przy użyciu technik przedstawionych w sekcji konfiguracji.
Rejestrowanie
Integracja .NET AspirePostgreSQL używa następujących kategorii dzienników:
Npgsql.Connection
Npgsql.Command
Npgsql.Transaction
Npgsql.Copy
Npgsql.Replication
Npgsql.Exception
Śledzenie
Integracja .NET AspirePostgreSQL spowoduje emitowanie następujących działań śledzenia przy użyciu OpenTelemetry:
Npgsql
Metryki
Integracja .NET AspirePostgreSQL będzie emitować następujące metryki przy użyciu OpenTelemetry:
- Npgsql:
ec_Npgsql_bytes_written_per_second
ec_Npgsql_bytes_read_per_second
ec_Npgsql_commands_per_second
ec_Npgsql_total_commands
ec_Npgsql_current_commands
ec_Npgsql_failed_commands
ec_Npgsql_prepared_commands_ratio
ec_Npgsql_connection_pools
ec_Npgsql_multiplexing_average_commands_per_batch
ec_Npgsql_multiplexing_average_write_time_per_batch
Dodaj uwierzytelnionego klienta Npgsql Azure
Domyślnie, podczas wywoływania AddAzurePostgresFlexibleServer
w integracji hostingu PostgreSQL, konfiguruje 📦AzureIdentity pakiet NuGet, aby włączyć uwierzytelnianie.
dotnet add package Azure.Identity
Połączenie PostgreSQL można używać przy użyciu integracji klienta i Azure.Identity:
builder.AddNpgsqlDataSource(
"postgresdb",
configureDataSourceBuilder: (dataSourceBuilder) =>
{
if (!string.IsNullOrEmpty(dataSourceBuilder.ConnectionStringBuilder.Password))
{
return;
}
dataSourceBuilder.UsePeriodicPasswordProvider(async (_, ct) =>
{
var credentials = new DefaultAzureCredential();
var token = await credentials.GetTokenAsync(
new TokenRequestContext([
"https://ossrdbms-aad.database.windows.net/.default"
]), ct);
return token.Token;
},
TimeSpan.FromHours(24),
TimeSpan.FromSeconds(10));
});
Powyższy fragment kodu pokazuje, jak używać klasy DefaultAzureCredential z pakietu Azure.Identity do uwierzytelniania za pomocą microsoft Entra ID i pobrać token do nawiązania połączenia z bazą danych PostgreSQL. Metoda UsePeriodicPasswordProvider służy do udostępniania tokenu konstruktorowi parametrów połączenia.