integracja .NET AspirePostgreSQL
obejmuje:integracja hostingu i integracja Client
PostgreSQL to zaawansowany, relacyjny system baz danych typu open source z wieloma latami aktywnego programowania, który zdobył silną reputację niezawodności, niezawodności funkcji i wydajności. Integracja .NET AspirePostgreSQL umożliwia połączenie z istniejącymi bazami danych PostgreSQL lub tworzenie nowych instancji z .NET z użyciem obrazu kontenera docker.io/library/postgres
.
Integracja hostingu
Integracja modeli hostowania PostgreSQL modeluje PostgreSQLserver w typie PostgresServerResource. Aby uzyskać dostęp do tego typu i interfejsów API, które umożliwiają dodanie go do
dotnet add package Aspire.Hosting.PostgreSQL
Aby uzyskać więcej informacji, zobacz dotnet add package lub Zarządzanie zależnościami pakietów w .NET aplikacjach.
Dodawanie zasobu PostgreSQLserver
W projekcie hosta aplikacji wywołaj AddPostgres w wystąpieniu builder
, aby dodać zasób PostgreSQLserver, a następnie wywołaj AddDatabase w wystąpieniu postgres
, aby dodać zasób bazy danych, jak pokazano w poniższym przykładzie:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Gdy .NET.NET Aspire dodaje obraz kontenera do hosta aplikacji, jak pokazano w poprzednim przykładzie z obrazem docker.io/library/postgres
, tworzy nowe wystąpienie PostgreSQLserver na komputerze lokalnym. Referencje do PostgreSQLserver oraz instancji bazy danych PostgreSQL (zmiennej postgresdb
) są używane do dodawania zależności do ExampleProject
. Zasób PostgreSQLserver zawiera poświadczenia domyślne z username
"postgres"
i losowo generowane password
przy użyciu metody CreateDefaultPasswordParameter.
Metoda WithReference konfiguruje połączenie w ExampleProject
o nazwie "messaging"
. Aby uzyskać więcej informacji, zobacz Cykl życia zasobów kontenera.
Napiwek
Jeśli wolisz nawiązać połączenie z istniejącym PostgreSQLserver, wywołaj AddConnectionString zamiast tego. Aby uzyskać więcej informacji, zobacz Odwołaj się do istniejących zasobów.
Dodawanie zasobu PostgreSQL pgAdmin
Podczas dodawania zasobów PostgreSQL do builder
za pomocą metody AddPostgres
można łańcuchowo wywoływać WithPgAdmin
, aby dodać kontener dpage/pgadmin4. Ten kontener jest wieloplatformowym client dla PostgreSQL baz danych, który obsługuje interfejs administracyjny dostępny przez internet. Rozważmy następujący przykład:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithPgAdmin();
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Kod powyżej dodaje kontener na bazie obrazu docker.io/dpage/pgadmin4
. Kontener służy do zarządzania zasobami PostgreSQLserver i bazami danych. Metoda WithPgAdmin
dodaje kontener obsługujący internetowy pulpit nawigacyjny administratora dla baz danych PostgreSQL.
Dodawanie zasobu PostgreSQL pgWeb
Podczas dodawania zasobów PostgreSQL do builder
przy użyciu metody AddPostgres
, można łączyć wywołania, aby za pomocą WithPgWeb
dodać kontener sosedoff/pgweb. Ten kontener jest wieloplatformowym client dla PostgreSQL baz danych, który obsługuje internetowy pulpit nawigacyjny administratora. Rozważmy następujący przykład:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithPgWeb();
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Powyższy kod dodaje kontener na podstawie obrazu docker.io/sosedoff/pgweb
. Wszystkie zarejestrowane wystąpienia PostgresDatabaseResource są używane do tworzenia pliku konfiguracji dla każdego wystąpienia, a każda konfiguracja jest powiązana z katalogiem zakładek kontenera pgweb. Aby uzyskać więcej informacji, zapoznaj się z dokumentacją PgWeb: Server zakładki dotyczące połączenia.
Dodawanie zasobu PostgreSQLserver z woluminem danych
Aby dodać wolumin danych do zasobu PostgreSQLserver, wywołaj metodę WithDataVolume w zasobie PostgreSQLserver:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithDataVolume(isReadOnly: false);
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Objętość danych służy do przechowywania danych PostgreSQLserver poza cyklem życia kontenera. Wolumin danych jest instalowany w ścieżce /var/lib/postgresql/data
w kontenerze PostgreSQLserver, a gdy nie podano parametru name
, nazwa jest generowana losowo. Aby uzyskać więcej informacji na temat woluminów danych i szczegółów na temat tego, dlaczego są preferowane w przypadku instalacji wiązania, zobacz Docker dokumentacji: woluminy.
Dodawanie zasobu PostgreSQLserver z instalacją powiązania danych
Aby dodać powiązanie danych do zasobu PostgreSQLserver, wywołaj metodę WithDataBindMount.
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithDataBindMount(
source: @"C:\PostgreSQL\Data",
isReadOnly: false);
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Ważny
Instalacje powiązane danych mają ograniczoną funkcjonalność w porównaniu z woluminami , co zapewnia lepszą wydajność, przenośność i bezpieczeństwo, co czyni je bardziej odpowiednimi dla środowisk produkcyjnych. Jednak montowanie wiązań umożliwia bezpośredni dostęp i modyfikację plików w systemie hosta, co jest idealne do rozwoju i testowania, gdzie potrzebne są zmiany w czasie rzeczywistym.
Instalacje powiązań danych wykorzystują system plików maszyny hosta do utrwalania danych PostgreSQLserver przy ponownych uruchomieniach kontenera. Powiązanie danych jest montowane w ścieżce C:\PostgreSQL\Data
na systemie Windows (lub /PostgreSQL/Data
na Unix) na maszynie hosta w kontenerze PostgreSQLserver. Aby uzyskać więcej informacji na temat montowania punktów powiązań danych, zobacz dokumentację Docker: "Montaż powiązań".
Dodaj zasób PostgreSQLserver z montażem wiążącym init
Aby dodać zamontowanie powiązania init do zasobu PostgreSQLserver, wywołaj metodę WithInitBindMount.
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithInitBindMount(@"C:\PostgreSQL\Init");
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Instalacja powiązania init opiera się na systemie plików maszyny hosta w celu zainicjowania bazy danych PostgreSQLserver przy użyciu kontenerów init folder. Ten folder służy do inicjowania, uruchamiania skryptów powłoki wykonywalnej lub plików poleceń .sql po utworzeniu folderu postgres-data. Powiązanie init jest zamontowane na ścieżce C:\PostgreSQL\Init
w systemie Windows (lub /PostgreSQL/Init
w Unix) na maszynie hosta w kontenerze PostgreSQLserver.
Dodawanie zasobu PostgreSQLserver z parametrami
Jeśli chcesz wyraźnie określić nazwę użytkownika i hasło używane przez obraz kontenera, możesz dostarczyć te poświadczenia w formie parametrów. Rozważmy następujący przykład alternatywny:
var builder = DistributedApplication.CreateBuilder(args);
var username = builder.AddParameter("username", secret: true);
var password = builder.AddParameter("password", secret: true);
var postgres = builder.AddPostgres("postgres", username, password);
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Aby uzyskać więcej informacji na temat udostępniania parametrów, zobacz Parametry zewnętrzne.
Kontrola stanu integracji hostingu
Integracja hostowania PostgreSQL automatycznie dodaje kontrolę kondycji zasobu PostgreSQLserver. Sprawdzenie stanu weryfikuje, czy PostgreSQLserver jest uruchomiona i czy można nawiązać z nią połączenie.
Integracja hostingu opiera się na pakiecie NuGet 📦 AspNetCore.HealthChecks.Npgsql.
integracja Client
Aby rozpocząć pracę z integracją .NET AspirePostgreSQLclient, zainstaluj 📦Aspire. Npgsql pakiet NuGet w projekcie korzystającym z client, czyli projektu dla aplikacji korzystającej z PostgreSQLclient. Integracja PostgreSQLclient rejestruje instancję NpgsqlDataSource, której można użyć do interakcji z PostgreSQL.
dotnet add package Aspire.Npgsql
Dodawanie npgsql client
W pliku Program.cs projektu zużywającego clientwywołaj metodę rozszerzenia AddNpgsqlDataSource na dowolnym IHostApplicationBuilder, aby zarejestrować NpgsqlDataSource
do użycia za pośrednictwem 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 PostgreSQLserver w projekcie hosta aplikacji. Aby uzyskać więcej informacji, zobacz Dodawanie zasobu PostgreSQLserver.
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 npgsql z kluczem client
Mogą wystąpić sytuacje, w których chcesz zarejestrować wiele wystąpień NpgsqlDataSource
z różnymi nazwami połączeń. Aby zarejestrować klientów Npgsql z kluczami, wywołaj metodę AddKeyedNpgsqlDataSource:
builder.AddKeyedNpgsqlDataSource(name: "chat");
builder.AddKeyedNpgsqlDataSource(name: "queue");
Następnie można za pomocą wstrzykiwania zależności pobrać wystąpienia NpgsqlDataSource
. 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 kluczy, zobacz .NET wstrzykiwanie zależności: usługi kluczy.
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 PostgreSQLclientJSON, zobacz Aspire. Npgsql/ConfigurationSchema.json.
Używanie delegatów wbudowanych
Możesz również przekazać delegata Action<NpgsqlSettings> configureSettings
, aby skonfigurować niektóre lub wszystkie opcje wbudowane, na przykład w celu wyłączenia kontroli kondycji:
builder.AddNpgsqlDataSource(
"postgresdb",
static settings => settings.DisableHealthChecks = true);
Kontrole kondycji
Domyślnie .NET.NET Aspire integracje umożliwiają sprawdzanie zdrowia 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 bazowego systemu baz danych Postgres. - Integruje się z
/health
punktem końcowym HTTP, który określa, że wszystkie zarejestrowane kontrole stanu zdrowia muszą zostać pomyślnie zakończone, aby aplikacja została uznana za gotową do akceptowania ruchu.
Obserwowanie i telemetria
.NET
.NET Aspire integracje automatycznie ustawiają 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
Wyrąb
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
Wskaźniki
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
Azure PostgreSQL integracji hostingu
Aby wdrożyć zasoby PostgreSQL w usłudze Azure, zainstaluj 📦Aspire.Hosting.Azure.PostgreSQL pakiet NuGet:
dotnet add package Aspire.Hosting.Azure.PostgreSQL
Dodawanie zasobu AzurePostgreSQLserver
Po zainstalowaniu integracji .NET AspireAzurePostgreSQL hostingu wywołaj metodę rozszerzenia AddAzurePostgresFlexibleServer
w projekcie hosta aplikacji:
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 PostgresSQL server, który ma zostać wdrożony jako elastyczny AzurePostgresServer.
Ważny
Domyślnie AddAzurePostgresFlexibleServer
konfiguruje uwierzytelnianie Microsoft Entra ID. Wymaga to zmian w aplikacjach, które muszą łączyć się z tymi zasobami. Aby uzyskać więcej informacji, zobacz Client integration.
Dodaj Azure uwierzytelnione Npgsql client
Domyślnie, gdy wywołujesz AddAzurePostgresFlexibleServer
w integracji hostingu PostgreSQL, konfiguruje to pakiet NuGet 📦Azure.Identity, aby umożliwić uwierzytelnianie.
dotnet add package Azure.Identity
Połączenie PostgreSQL można wykorzystać za pomocą integracji client 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.