Delen via


Aspire PostgreSQL-integratie

Inclusief:Hostingintegratie inbegrepen —&— Client integratie inbegrepenClient integratie

PostgreSQL is een krachtig opensource-object-relationeel databasesysteem met vele jaren actieve ontwikkeling die het een sterke reputatie heeft verdiend voor betrouwbaarheid, robuustheid en prestaties. De AspirePostgreSQL-integratie biedt een manier om verbinding te maken met bestaande PostgreSQL-databases of nieuwe exemplaren te maken op basis van .NET met de docker.io/library/postgres containerimage.

Hostingintegratie

De hostintegratiemodellen van PostgreSQL beschouwen de verschillende PostgreSQL resources als de volgende typen.

Als u toegang wilt krijgen tot deze typen en API's om ze uit te drukken als resources in uw AppHost-project , installeert u het 📦Aspire. Gastvrijheid.PostgreSQL NuGet-pakket:

dotnet add package Aspire.Hosting.PostgreSQL

Zie dotnet pakket toevoegen of Pakketafhankelijkheden beheren in .NET toepassingenvoor meer informatie.

PostgreSQL serverresource toevoegen

Roep in uw AppHost-project AddPostgres het builder exemplaar aan om een PostgreSQL serverresource toe te voegen en roep AddDatabase vervolgens het postgres exemplaar aan om een databaseresource toe te voegen, zoals wordt weergegeven in het volgende voorbeeld:

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...

Wanneer Aspire een containerafbeelding toevoegt aan de AppHost, zoals wordt weergegeven in het voorgaande voorbeeld met de docker.io/library/postgres afbeelding, wordt er een nieuw PostgreSQL serverexemplaar gemaakt op uw lokale computer. Een verwijzing naar uw PostgreSQL server- en database-exemplaar (de postgresdb variabele) wordt gebruikt om een afhankelijkheid toe te voegen aan de ExampleProject.

Wanneer u een databaseresource toevoegt aan het app-model, wordt de database gemaakt als deze nog niet bestaat. Het maken van de database is afhankelijk van de AppHost-gebeurtenis-API's, met name ResourceReadyEvent. Met andere woorden, wanneer de postgres resource gereed is, wordt de gebeurtenis getriggerd en wordt de databasebron aangemaakt.

De PostgreSQL-server-resource bevat standaardgegevens met een username van "postgres" en willekeurig gegenereerde password met behulp van de CreateDefaultPasswordParameter-methode.

De methode WithReference configureert een verbinding in de ExampleProject met de naam "messaging". Zie levenscyclus van containerresourcesvoor meer informatie.

Aanbeveling

Als u liever verbinding wilt maken met een bestaande PostgreSQL-server, roept u in plaats daarvan AddConnectionString aan. Voor meer informatie, raadpleeg Bestaande bronnen.

Een resource PostgreSQL toevoegen met databasescripts

Wanneer u een PostgresDatabaseResourcetoevoegt, is het standaard afhankelijk van het volgende script om de database te maken:

CREATE DATABASE "<QUOTED_DATABASE_NAME>"

Als u het standaardscript wilt wijzigen, koppelt u een aanroep aan de WithCreationScript(IResourceBuilder<PostgresDatabaseResource>, String) methode in de opbouwfunctie voor databaseresources:

var builder = DistributedApplication.CreateBuilder(args);

var postgres = builder.AddPostgres("postgres");

var databaseName = "app_db";
var creationScript = $$"""
    -- Create the database
    CREATE DATABASE {{databaseName}};

    """;

var db = postgres.AddDatabase(databaseName)
                 .WithCreationScript(creationScript);

builder.AddProject<Projects.ExampleProject>()
       .WithReference(db)
       .WaitFor(db);

// After adding all resources, run the app...

In het voorgaande voorbeeld wordt een database gemaakt met de naam app_db. Het script wordt uitgevoerd wanneer de databaseresource wordt gemaakt. Het script wordt doorgegeven als een tekenreeks aan de WithCreationScript methode, die vervolgens wordt uitgevoerd in de context van de PostgreSQL resource.

Opmerking

De opdracht om met een database te verbinden (\c) wordt niet ondersteund bij gebruik van het aanmaakscrip.

PostgreSQL pgAdmin-resource toevoegen

Wanneer u PostgreSQL-middelen toevoegt aan de builder met de AddPostgres-methode, kunt u aanroepen koppelen aan WithPgAdmin om de -dpage/pgadmin4---container toe te voegen. Deze container is een platformoverschrijdende client voor PostgreSQL databases die een webgebaseerde beheerdashboard dient. Bekijk het volgende voorbeeld:

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...

De code voegt een container toe op basis van de docker.io/dpage/pgadmin4-image. De container wordt gebruikt voor het beheren van de PostgreSQL server- en databasebronnen. Met de methode WithPgAdmin wordt een container toegevoegd die een webbeheerdashboard voor PostgreSQL databases bedient.

De pgAdmin-hostpoort configureren

Als u de hostpoort voor de pgAdmin-container wilt configureren, roept u de WithHostPort methode aan op de PostgreSQL serverresource. In het volgende voorbeeld ziet u hoe u de hostpoort voor de pgAdmin-container configureert:

var builder = DistributedApplication.CreateBuilder(args);

var postgres = builder.AddPostgres("postgres")
                      .WithPgAdmin(pgAdmin => pgAdmin.WithHostPort(5050));

var postgresdb = postgres.AddDatabase("postgresdb");

var exampleProject = builder.AddProject<Projects.ExampleProject>()
                            .WithReference(postgresdb);

// After adding all resources, run the app...

Met de voorgaande code wordt de hostpoort voor de pgAdmin-container toegevoegd en geconfigureerd. De hostpoort wordt anders willekeurig toegewezen.

PostgreSQL pgWeb-resource toevoegen

Wanneer u PostgreSQL resources toevoegt aan de builder met de AddPostgres-methode, kunt u opeenvolgende aanroepen naar WithPgWeb maken om de sosedoff/pgweb-container toe te voegen. Deze container is een platformoverschrijdende client voor PostgreSQL databases die een webgebaseerde beheerdashboard dient. Bekijk het volgende voorbeeld:

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...

De code voegt een container toe op basis van de docker.io/sosedoff/pgweb-image. Alle geregistreerde PostgresDatabaseResource-exemplaren worden gebruikt om een configuratiebestand per exemplaar te maken, waarbij elke configuratie wordt gebonden aan de pgweb container-bladwijzermap. Zie voor meer informatie de PgWeb-documenten: Server verbindingsbladmarker.

De pgWeb-hostpoort configureren

Als u de hostpoort voor de pgWeb-container wilt configureren, roept u de WithHostPort methode aan op de PostgreSQL-serverresource. In het volgende voorbeeld ziet u hoe u de hostpoort voor de pgAdmin-container configureert:

var builder = DistributedApplication.CreateBuilder(args);

var postgres = builder.AddPostgres("postgres")
                      .WithPgWeb(pgWeb => pgWeb.WithHostPort(5050));

var postgresdb = postgres.AddDatabase("postgresdb");

var exampleProject = builder.AddProject<Projects.ExampleProject>()
                            .WithReference(postgresdb);

// After adding all resources, run the app...

Met de voorgaande code wordt de hostpoort voor de pgWeb-container toegevoegd en geconfigureerd. De hostpoort wordt anders willekeurig toegewezen.

PostgreSQL serverresource toevoegen met gegevensvolume

Als u een gegevensvolume wilt toevoegen aan de PostgreSQL serverresource, roept u de WithDataVolume methode aan op de PostgreSQL serverresource:

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...

Het gegevensvolume wordt gebruikt om de PostgreSQL servergegevens buiten de levenscyclus van de container te behouden. Het gegevensvolume wordt gekoppeld aan het /var/lib/postgresql/data pad in de PostgreSQL servercontainer en wanneer er geen name parameter wordt opgegeven, wordt de naam willekeurig gegenereerd. Zie voor meer informatie over gegevensvolumes en details over waarom ze de voorkeur hebben boven Docker.

Belangrijk

Sommige databaseintegraties, inclusief de AspirePostgreSQL integratie, kunnen geen gegevensvolumes gebruiken na de implementatie naar Azure Container Apps (ACA). Dit komt doordat ACA gebruikmaakt van Server Message Block (SMB) om containers te verbinden met gegevensvolumes, en sommige systemen kunnen deze verbinding niet gebruiken. In het Aspire dashboard heeft een database die wordt beïnvloed door dit probleem de status Activeren of Activeren is mislukt , maar wordt nooit vermeld als Actief.

U kunt het probleem oplossen door de beheerde servicedatabaseAzure te gebruiken om PostgreSQL de geïmplementeerde database te hosten in plaats van een container in ACA. Dit is de aanbevolen aanpak, ongeacht dit probleem. De volgende AppHost-code laat zien hoe u een database implementeert in Azure Database for PostgreSQL, maar deze uitvoert als een container, met een gegevensvolume, tijdens de ontwikkeling:

var builder = DistributedApplication.CreateBuilder(args);

var postgres = builder.AddAzurePostgresFlexibleServer("postgres")
                      .RunAsContainer(container => 
                      {
                        container.WithDataVolume();
                      });

builder.Build().Run();

PostgreSQL serverbron toevoegen met data-bind mount

Als u een gegevensbindingskoppeling wilt toevoegen aan de PostgreSQL-serverresource, roept u de methode WithDataBindMount aan:

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...

Belangrijk

Data bind-mounts hebben een beperkte functionaliteit vergeleken met volumes, die betere prestaties, draagbaarheid en beveiliging bieden, en daardoor beter geschikt zijn voor productieomgevingen. Bindingskoppelingen bieden echter directe toegang tot en wijziging van bestanden op het hostsysteem, ideaal voor ontwikkeling en testen waar wijzigingen in realtime nodig zijn.

Gegevensbindmontages zijn afhankelijk van het bestandssysteem van de hostmachine om de PostgreSQL-servergegevens bij herstarten van de container te behouden. De data-bindmount is gemonteerd op het pad C:\PostgreSQL\Data op de hostcomputer in Windows (of /PostgreSQL/Data op Unix) in de PostgreSQL servercontainer. Zie Docker docs: Bindingskoppelingen voor meer informatie over gegevens-bindingskoppelingen.

PostgreSQL serverbron toevoegen met init-bind mount

Als u een init-bindingskoppeling wilt toevoegen aan de PostgreSQL-serverresource, roept u de methode WithInitBindMount aan:

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...

De init bind mount vertrouwt op het bestandssysteem van de host om de PostgreSQL serverdatabase te initialiseren met de init-map van de containers. Deze map wordt gebruikt voor initialisatie, het uitvoeren van uitvoerbare shellscripts of .sql opdrachtbestanden nadat de postgres-gegevens map is gemaakt. De init-bind mount wordt gekoppeld op C:\PostgreSQL\Init op Windows (of /PostgreSQL/Init op Unix) pad van de hostcomputer in de PostgreSQL servercontainer.

PostgreSQL serverresource toevoegen met parameters

Als u expliciet de gebruikersnaam en het wachtwoord wilt opgeven die de containerimage gebruikt, kunt u deze aanmeldgegevens opgeven als parameters. Bekijk het volgende alternatieve voorbeeld:

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...

Zie Externe parametersvoor meer informatie over het opgeven van parameters.

Gezondheidscontroles voor hostingintegratie

De PostgreSQL hostingintegratie voegt automatisch een statuscontrole toe voor de PostgreSQL serverresource. De gezondheidscontrole controleert of de PostgreSQL-server draait en of er een verbinding mee kan worden gemaakt.

De hostingintegratie is afhankelijk van het 📦 AspNetCore.HealthChecks.Npgsql NuGet-pakket.

Gebruik met niet-.NET-toepassingen

De PostgreSQL hostingintegratie kan worden gebruikt met elke toepassingstechnologie, niet alleen .NET toepassingen. Wanneer u WithReference gebruikt om naar een PostgreSQL-resource te verwijzen, wordt verbindingsinformatie automatisch als omgevingsvariabelen in de verwijzende toepassing ingevoegd.

Voor toepassingen die de clientintegratie niet gebruiken, hebt u toegang tot de verbindingsgegevens via omgevingsvariabelen. Hier is een voorbeeld van hoe u omgevingsvariabelen configureert voor een applicatie zonder .NET:

var builder = DistributedApplication.CreateBuilder(args);

var postgres = builder.AddPostgres("postgres")
    .WithLifetime(ContainerLifetime.Persistent);

var database = postgres.AddDatabase("myDatabase");

// Example: Configure a non-.NET application with PostgreSQL access
var app = builder.AddExecutable("my-app", "node", "app.js", ".")
    .WithReference(database) // Provides ConnectionStrings__myDatabase
    .WithEnvironment(context =>
    {
        // Additional individual connection details as environment variables
        context.EnvironmentVariables["POSTGRES_HOST"] = postgres.Resource.PrimaryEndpoint.Property(EndpointProperty.Host);
        context.EnvironmentVariables["POSTGRES_PORT"] = postgres.Resource.PrimaryEndpoint.Property(EndpointProperty.Port);
        context.EnvironmentVariables["POSTGRES_USER"] = postgres.Resource.UserNameParameter;
        context.EnvironmentVariables["POSTGRES_PASSWORD"] = postgres.Resource.PasswordParameter;
        context.EnvironmentVariables["POSTGRES_DATABASE"] = database.Resource.DatabaseName;
    });

builder.Build().Run();

Deze configuratie biedt de niet-.NET-applicatie verschillende omgevingsvariabelen:

  • ConnectionStrings__myDatabase: De volledige PostgreSQL verbindingsreeks
  • POSTGRES_HOST: De hostnaam/het IP-adres van de PostgreSQL server
  • POSTGRES_PORT: Het poortnummer waarop de PostgreSQL server luistert
  • POSTGRES_USER: De gebruikersnaam van de database
  • POSTGRES_PASSWORD: Het dynamisch gegenereerde wachtwoord
  • POSTGRES_DATABASE: De naam van de database

Uw niet-.NET-applicatie kan deze omgevingsvariabelen vervolgens lezen om verbinding te maken met de PostgreSQL database met behulp van het juiste databasestuurprogramma voor die technologie (bijvoorbeeld psycopg2 voor Python, pg voor Node.js, of pq voor Go).

integratie Client

Installeer het Aspire NuGet-pakket om aan de slag te gaan met de PostgreSQL📦-clientintegratie in het project dat de client gebruikt, dat wil zeggen, het project voor de toepassing die gebruikmaakt van de Aspire-client. De PostgreSQL-clientintegratie registreert een NpgsqlDataSource--exemplaar dat u kunt gebruiken om met PostgreSQLte communiceren.

dotnet add package Aspire.Npgsql

Npgsql-client toevoegen

Roep in het Program.cs bestand van het clientgebruikte project de AddNpgsqlDataSource-extensiemethode aan op elke IHostApplicationBuilder om een NpgsqlDataSource te registreren voor gebruik via de container voor afhankelijkheidsinjectie. De methode gebruikt een verbindingsnaamparameter.

builder.AddNpgsqlDataSource(connectionName: "postgresdb");

Aanbeveling

De connectionName parameter moet overeenkomen met de naam die wordt gebruikt bij het toevoegen van de PostgreSQL serverresource in het AppHost-project. Zie PostgreSQL serverresource toevoegenvoor meer informatie.

Nadat u NpgsqlDataSource aan de builder hebt toegevoegd, kunt u de NpgsqlDataSource-instantie verkrijgen met behulp van afhankelijkheidsinjectie. Als u bijvoorbeeld uw gegevensbronobject wilt ophalen uit een voorbeeldservice, definieert u het als een constructorparameter en zorgt u ervoor dat de klasse ExampleService is geregistreerd bij de container voor afhankelijkheidsinjectie:

public class ExampleService(NpgsqlDataSource dataSource)
{
    // Use dataSource...
}

Voor meer informatie over afhankelijkheidsinjectie, zie .NET afhankelijkheidsinjectie.

Npgsql-client met sleutels toevoegen

Er kunnen situaties zijn waarin u meerdere NpgsqlDataSource exemplaren met verschillende verbindingsnamen wilt registreren. Als u keyed Npgsql-clients wilt registreren, roept u de methode AddKeyedNpgsqlDataSource aan:

builder.AddKeyedNpgsqlDataSource(name: "chat");
builder.AddKeyedNpgsqlDataSource(name: "queue");

Vervolgens kunt u met behulp van dependency injection de NpgsqlDataSource exemplaren ophalen. Als u bijvoorbeeld de verbinding wilt ophalen uit een voorbeeldservice:

public class ExampleService(
    [FromKeyedServices("chat")] NpgsqlDataSource chatDataSource,
    [FromKeyedServices("queue")] NpgsqlDataSource queueDataSource)
{
    // Use data sources...
}

Voor meer informatie over gesleutelde services, zie .NET afhankelijkheidsinjectie: Keyed Services.

Configuratie

De AspirePostgreSQL-integratie biedt meerdere configuratiemethoden en opties om te voldoen aan de vereisten en conventies van uw project.

Een verbindingsreeks gebruiken

Wanneer u een verbindingsreeks uit de sectie ConnectionStrings configuratie gebruikt, kunt u de naam van de verbindingsreeks opgeven bij het aanroepen van de AddNpgsqlDataSource methode:

builder.AddNpgsqlDataSource("postgresdb");

Vervolgens wordt de verbindingsreeks opgehaald uit de ConnectionStrings configuratiesectie:

{
  "ConnectionStrings": {
    "postgresdb": "Host=myserver;Database=postgresdb"
  }
}

Zie de ConnectionStringvoor meer informatie.

Configuratieproviders gebruiken

De AspirePostgreSQL-integratie ondersteunt Microsoft.Extensions.Configuration. Het laadt de NpgsqlSettings uit appsettings.json of andere configuratiebestanden met behulp van de Aspire:Npgsql-sleutel. Voorbeeld appsettings.json waarmee een aantal van de opties wordt geconfigureerd:

In het volgende voorbeeld ziet u een appsettings.json-bestand waarmee een aantal van de beschikbare opties wordt geconfigureerd:

{
  "Aspire": {
    "Npgsql": {
      "ConnectionString": "Host=myserver;Database=postgresdb",
      "DisableHealthChecks": false,
      "DisableTracing": true,
      "DisableMetrics": false
    }
  }
}

Zie het volledige PostgreSQL clientintegratieschema JSON in Aspire.Npgsql/ConfigurationSchema.json.

Gebruik inline-afgevaardigden

U kunt ook de Action<NpgsqlSettings> configureSettings delegate doorgeven om sommige of alle opties rechtstreeks in te stellen, bijvoorbeeld om gezondheidscontroles uit te schakelen:

builder.AddNpgsqlDataSource(
    "postgresdb",
     static settings => settings.DisableHealthChecks = true);

Gezondheidschecks voor Client-integratie

Aspire hebben standaard gezondheidscontroles ingeschakeld voor alle diensten. Op dezelfde manier maken veel Aspirehostingintegraties ook statuscontrole-eindpunten mogelijk. Zie voor meer informatie:

  • Voegt de NpgSqlHealthChecktoe, waarmee wordt gecontroleerd of opdrachten kunnen worden uitgevoerd op basis van de onderliggende Postgres-database.
  • Integreert met het /health HTTP-eindpunt, waarbij alle geregistreerde statuscontroles moeten slagen zodat de app klaar wordt geacht om verkeer te accepteren.

Waarneembaarheid en telemetrie

Aspire Integraties stellen automatisch configuraties voor logboekregistratie, tracering en metrische gegevens in, die ook wel de pijlers van waarneembaarheid worden genoemd. Zie het overzicht van integratieobserveerbaarheid en telemetrie voor meer informatie over integratieobserveerbaarheid en telemetrieAspire. Afhankelijk van de back-upservice ondersteunen sommige integraties mogelijk slechts enkele van deze functies. Sommige integraties ondersteunen bijvoorbeeld logboekregistratie en tracering, maar geen metrische gegevens. Telemetriefuncties kunnen ook worden uitgeschakeld met behulp van de technieken die worden weergegeven in de sectie Configuratie.

Loggen

De AspirePostgreSQL-integratie maakt gebruik van de volgende logboekcategorieën:

  • Npgsql.Connection
  • Npgsql.Command
  • Npgsql.Transaction
  • Npgsql.Copy
  • Npgsql.Replication
  • Npgsql.Exception

Opsporing

De AspirePostgreSQL-integratie verzendt de volgende traceringsactiviteiten met behulp van OpenTelemetry:

  • Npgsql

Statistieken

De integratie van AspirePostgreSQL verzendt de volgende metrische gegevens met behulp van 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

Zie ook