.NET Aspire PostgreSQL integração
Inclui:integração de hosting e integração Client
PostgreSQL é um poderoso sistema de banco de dados objeto-relacional de código aberto com muitos anos de desenvolvimento ativo que lhe rendeu uma forte reputação de confiabilidade, robustez de recursos e desempenho. A integração .NET AspirePostgreSQL fornece uma maneira de se conectar a bancos de dados PostgreSQL existentes ou criar novas instâncias a partir de .NET com a imagem de contêiner docker.io/library/postgres
.
Integração de hospedagem
A integração de hospedagem PostgreSQL modela um PostgreSQLserver como o tipo PostgresServerResource. Para aceder a este tipo e às APIs que lhe permitem adicioná-lo ao seu 📦Aspire.Hosting.PostgreSQL pacote NuGet na aplicação projeto de host.
- .NET CLI
- PackageReference
dotnet add package Aspire.Hosting.PostgreSQL
Para obter mais informações, consulte dotnet add package ou Gerir dependências de pacotes em aplicações .NET.
Adicionar PostgreSQLserver recurso
Em seu projeto de host de aplicativo, chame AddPostgres na instância builder
para adicionar um recurso de PostgreSQLserver e, em seguida, chame AddDatabase na instância postgres
para adicionar um recurso de banco de dados, conforme mostrado no exemplo a seguir:
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...
Quando .NET.NET Aspire adiciona uma imagem de contêiner ao host do aplicativo, como mostrado no exemplo anterior com a imagem docker.io/library/postgres
, ele cria uma nova instância de PostgreSQLserver em sua máquina local. Uma referência ao seu PostgreSQLserver e sua instância de banco de dados PostgreSQL (a variável postgresdb
) são usadas para adicionar uma dependência ao ExampleProject
. O recurso PostgreSQLserver inclui credenciais padrão com uma username
de "postgres"
e password
gerados aleatoriamente usando o método CreateDefaultPasswordParameter.
O método WithReference configura uma conexão no ExampleProject
chamado "messaging"
. Para obter mais informações, consulte Ciclo de vida do recurso de contêiner.
Dica
Se preferir conectar-se a um PostgreSQLserverexistente, ligue para AddConnectionString em vez disso. Para mais informações, consulte Recursos existentes de referência.
Adicionar PostgreSQL recurso pgAdmin
Ao adicionar recursos de
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...
O código anterior adiciona um contêiner com base na imagem docker.io/dpage/pgadmin4
. O container é utilizado para gerir os recursos PostgreSQL,server e de base de dados. O método WithPgAdmin
adiciona um contêiner que serve um painel de administração baseado na Web para bancos de dados PostgreSQL.
Adicionar PostgreSQL recurso pgWeb
Ao adicionar recursos de
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...
O código anterior adiciona um contêiner com base na imagem docker.io/sosedoff/pgweb
. Todas as instâncias de PostgresDatabaseResource registradas são usadas para criar um arquivo de configuração por instância e cada configuração é vinculada ao diretório de marcadores de contêiner pgweb. Para obter mais informações, consulte os documentos PgWeb : marcadores de conexão Server.
Adicionar recurso PostgreSQLserver com volume de dados
Para adicionar um volume de dados ao recurso PostgreSQLserver, chame o método WithDataVolume no recurso 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...
O volume de dados é usado para persistir os dados PostgreSQLserver fora do ciclo de vida do seu contentor. O volume de dados é montado no caminho /var/lib/postgresql/data
no contêiner PostgreSQLserver e, quando um parâmetro name
não é fornecido, o nome é gerado aleatoriamente. Para obter mais informações sobre volumes de dados e detalhes sobre por que eles são preferidos em relação a montagens de ligação , consulte Docker docs: Volumes.
Adicionar recurso PostgreSQLserver com montagem de ligação de dados
Para adicionar uma montagem de associação de dados ao recurso PostgreSQLserver, chame o método 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...
Importante
Os suportes de ligação de de dados têm funcionalidade limitada em comparação com volumes, que oferecem melhor desempenho, portabilidade e segurança, tornando-os mais adequados para ambientes de produção. No entanto, as montagens bind permitem o acesso direto e a modificação de arquivos no sistema host, ideal para desenvolvimento e testes onde alterações em tempo real são necessárias.
As montagens de associação de dados dependem do sistema de arquivos da máquina host para manter os dados PostgreSQLserver nas reinicializações do contêiner. A montagem de associação de dados é montada no caminho C:\PostgreSQL\Data
no Windows (ou /PostgreSQL/Data
no Unix) na máquina host no contentor PostgreSQLserver. Para obter mais informações sobre montagens de associação de dados, consulte Docker docs: Bind mounts.
Adicionar o recurso PostgreSQLserver com init bind mount
Para adicionar uma montagem de ligação init ao recurso PostgreSQLserver, chame o método 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...
A montagem de bind init baseia-se no sistema de ficheiros da máquina anfitriã para inicializar o banco de dados PostgreSQLserver com a pasta init do contêiner . Esta pasta é usada para inicialização, executando quaisquer scripts de shell executáveis ou ficheiros de comando .sql após a criação da pasta postgres-data. A montagem inicial de ligação está montada no caminho C:\PostgreSQL\Init
no Windows (ou /PostgreSQL/Init
no Unix) na máquina host no contentor PostgreSQLserver.
Adicionar PostgreSQLserver recurso com parâmetros
Quando quiser fornecer explicitamente o nome de usuário e a senha usados pela imagem do contêiner, você poderá fornecer essas credenciais como parâmetros. Considere o seguinte exemplo alternativo:
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...
Para obter mais informações sobre como fornecer parâmetros, consulte Parâmetros externos.
Verificações de integridade da integração de hospedagem
A integração de hospedagem PostgreSQL adiciona automaticamente uma verificação de integridade para o recurso PostgreSQLserver. A verificação de integridade verifica se o PostgreSQLserver está em execução e se uma conexão pode ser estabelecida com ele.
A integração de hospedagem depende do 📦 AspNetCore.HealthChecks.Npgsql pacote NuGet.
integração Client
Para começar com a integração .NET AspirePostgreSQLclient, instale o 📦Aspire. Npgsql pacote NuGet no projeto de consumo de client, ou seja, o projeto para o aplicativo que usa o PostgreSQLclient. A integração PostgreSQLclient registra uma instância NpgsqlDataSource que você pode usar para interagir com PostgreSQL.
- .NET CLI
- PackageReference
dotnet add package Aspire.Npgsql
Adicionar Npgsql client
No arquivo Program.cs do seu projeto que consome client, chame o método de extensão AddNpgsqlDataSource em qualquer IHostApplicationBuilder para registrar um NpgsqlDataSource
para uso através do contêiner de injeção de dependência. O método usa um parâmetro de nome de conexão.
builder.AddNpgsqlDataSource(connectionName: "postgresdb");
Dica
O parâmetro connectionName
deve corresponder ao nome usado ao adicionar o recurso PostgreSQLserver no projeto de host do aplicativo. Para obter mais informações, consulte Adicionar PostgreSQLserver recurso.
Depois de adicionar NpgsqlDataSource
ao construtor, você pode obter a instância NpgsqlDataSource
usando a injeção de dependência. Por exemplo, para recuperar seu objeto de fonte de dados de um serviço de exemplo, defina-o como um parâmetro de construtor e verifique se a classe ExampleService
está registrada com o contêiner de injeção de dependência:
public class ExampleService(NpgsqlDataSource dataSource)
{
// Use dataSource...
}
Para obter mais informações sobre a injeção de dependência, consulte .NET.
Adicionar Npgsql com chave client
Pode haver situações em que você queira registrar várias instâncias de NpgsqlDataSource
com nomes de conexão diferentes. Para registrar clientes Npgsql com chave, chame o método AddKeyedNpgsqlDataSource:
builder.AddKeyedNpgsqlDataSource(name: "chat");
builder.AddKeyedNpgsqlDataSource(name: "queue");
Em seguida, você pode recuperar as instâncias NpgsqlDataSource
usando a injeção de dependência. Por exemplo, para recuperar a conexão de um serviço de exemplo:
public class ExampleService(
[FromKeyedServices("chat")] NpgsqlDataSource chatDataSource,
[FromKeyedServices("queue")] NpgsqlDataSource queueDataSource)
{
// Use data sources...
}
Para obter mais informações sobre serviços com chave, consulte .NET injeção de dependência: Serviços com chave.
Configuração
A integração .NET AspirePostgreSQL fornece várias abordagens e opções de configuração para atender aos requisitos e convenções do seu projeto.
Usar uma cadeia de conexão
Ao usar uma cadeia de conexão da seção de configuração de ConnectionStrings
, você pode fornecer o nome da cadeia de conexão ao chamar o método AddNpgsqlDataSource:
builder.AddNpgsqlDataSource("postgresdb");
Em seguida, a cadeia de conexão será recuperada da seção de configuração ConnectionStrings
:
{
"ConnectionStrings": {
"postgresdb": "Host=myserver;Database=postgresdb"
}
}
Para obter mais informações, consulte o ConnectionString.
Usar provedores de configuração
A integração .NET AspirePostgreSQL suporta Microsoft.Extensions.Configuration. Carrega o NpgsqlSettings a partir de appsettings.json ou outros ficheiros de configuração usando a chave Aspire:Npgsql
. Exemplo de appsettings.json que configura algumas das opções:
O exemplo a seguir mostra um arquivo appsettings.json que configura algumas das opções disponíveis:
{
"Aspire": {
"Npgsql": {
"ConnectionString": "Host=myserver;Database=postgresdb",
"DisableHealthChecks": false,
"DisableTracing": true,
"DisableMetrics": false
}
}
}
Para obter a integração PostgreSQLclient completa do esquema JSON, consulte Aspire. Npgsql/ConfigurationSchema.json.
Usar delegados embutidos
Você também pode passar o delegado Action<NpgsqlSettings> configureSettings
para configurar algumas ou todas as opções diretamente, por exemplo, para desativar as verificações de saúde:
builder.AddNpgsqlDataSource(
"postgresdb",
static settings => settings.DisableHealthChecks = true);
Controlos sanitários
Por padrão, as integrações .NET.NET Aspire habilitam verificações de integridade para todos os serviços. Para obter mais informações, consulte .NET.NET Aspire visão geral das integrações.
- Adiciona o
NpgSqlHealthCheck
, que verifica se os comandos podem ser executados com êxito no Banco de Dados Postgres subjacente. - Integra-se com o ponto de extremidade HTTP
/health
, onde é especificado que todas as verificações de integridade registadas devem passar para que o aplicativo seja considerado pronto para receber tráfego.
Observabilidade e telemetria
.NET .NET Aspire integrações configuram automaticamente as funções de registo, rastreamento e métricas, que às vezes são conhecidas como os pilares da observabilidade. Para obter mais informações sobre observabilidade e telemetria de integração, consulte Visão geral de integrações .NET.NET Aspire. Dependendo do serviço de suporte, algumas integrações podem suportar apenas alguns desses recursos. Por exemplo, algumas integrações suportam registro em log e rastreamento, mas não métricas. Os recursos de telemetria também podem ser desativados utilizando as técnicas apresentadas na seção Configuração.
Registo
A integração .NET AspirePostgreSQL usa as seguintes categorias de log:
Npgsql.Connection
Npgsql.Command
Npgsql.Transaction
Npgsql.Copy
Npgsql.Replication
Npgsql.Exception
Rastreio
A integração .NET AspirePostgreSQL emitirá as seguintes atividades de rastreamento usando OpenTelemetry:
Npgsql
Métricas
A integração .NET AspirePostgreSQL emitirá as seguintes métricas usando 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 integração de hospedagem
Para implantar os seus recursos de PostgreSQL no Azure, instale o 📦Aspire.Hosting.Azure.PostgreSQL pacote NuGet:
- .NET CLI
- Referência de Pacote
dotnet add package Aspire.Hosting.Azure.PostgreSQL
Adicionar AzurePostgreSQLserver recurso
Depois de instalar a integração de hospedagem .NET AspireAzurePostgreSQL, chame o método de extensão AddAzurePostgresFlexibleServer
em seu projeto de host de aplicativo:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddAzurePostgresFlexibleServer("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
A chamada anterior para AddAzurePostgresFlexibleServer
configura o recurso PostgresSQL server a ser implantado como um flexível AzurePostgresServer.
Importante
Por padrão, AddAzurePostgresFlexibleServer
configura a autenticação do Microsoft Entra ID. Isso requer alterações nos aplicativos que precisam se conectar a esses recursos. Para obter mais informações, consulte a integração Client.
Adicionar Azureclient Npgsql autenticado
Por padrão, quando chamas AddAzurePostgresFlexibleServer
na tua integração de alojamento PostgreSQL, ele configura o pacote NuGet 📦Azure.Identidade para ativar a autenticação.
- .NET CLI
- PackageReference
dotnet add package Azure.Identity
A conexão PostgreSQL pode ser consumida usando a integração client e 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));
});
O trecho de código anterior demonstra como usar a classe DefaultAzureCredential do pacote Azure.Identity para autenticar-se com o Microsoft Entra ID e obter um token para conectar-se ao banco de dados PostgreSQL. O método UsePeriodicPasswordProvider é usado para fornecer o token ao construtor da cadeia de conexão.