.NET Aspire PostgreSQL 整合
PostgreSQL 是一個強大的開放原始碼對象關係資料庫系統,具有多年的積極開發,因此其可靠性、功能強固性和效能享有盛譽。
.NET Aspire
PostgreSQL 整合可讓您連線到現有的 PostgreSQL 資料庫,或使用 docker.io/library/postgres
容器映射從 .NET 建立新的實例。
託管整合
裝載整合 PostgreSQL 會將 PostgreSQLserver 模型化為 PostgresServerResource 類型。 若要存取此類型和 API,並將它新增至 📦Aspire中的 HostingPostgreSQL NuGet 套件,在 應用程式主機 專案中。
dotnet add package Aspire.Hosting.PostgreSQL
如需詳細資訊,請參閱 dotnet add package 或 在 .NET 應用程式中管理套件相依性。
新增 PostgreSQLserver 資源
在應用程式主機專案中,呼叫 builder
實例上的 AddPostgres 以新增 PostgreSQLserver 資源,然後在 postgres
實例上呼叫 AddDatabase,以新增資料庫資源,如下列範例所示:
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...
當 .NET.NET Aspire 將容器映像檔新增至應用程式主機時,如上述範例中以 docker.io/library/postgres
映像檔所示,它會在本機計算機上建立新的 PostgreSQLserver 實例。
PostgreSQL
server 和 PostgreSQL 資料庫實例的參考(postgresdb
變數)可用來將相依性新增至 ExampleProject
。
PostgreSQL
server 資源包含具有 "postgres"
為 username
的預設憑證,並使用 CreateDefaultPasswordParameter 方法隨機生成 password
。
WithReference 方法會在名為 "messaging"
的 ExampleProject
中設定連接。 如需詳細資訊,請參閱 容器資源生命週期。
提示
如果您想要連線到現有的 PostgreSQLserver,請改為呼叫 AddConnectionString。 如需詳細資訊,請參閱 參考現有資源。
新增 PostgreSQL pgAdmin 資源
使用 AddPostgres
方法將 PostgreSQL 資源新增至 builder
時,您可以將呼叫鏈結至 WithPgAdmin
以新增 dpage/pgadmin4 容器。 此容器是用於 PostgreSQL 資料庫的跨平台 client,提供基於網頁的管理儀表板。 請考慮下列範例:
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...
上述程式代碼會根據 docker.io/dpage/pgadmin4
映像新增容器。 容器可用來管理 PostgreSQLserver 和資料庫資源。
WithPgAdmin
方法用於新增容器,提供 PostgreSQL 資料庫的網頁式管理儀表板。
新增 PostgreSQL pgWeb 資源
使用 AddPostgres
方法將 PostgreSQL 資源新增至 builder
時,您可以將呼叫鏈結至 WithPgWeb
以新增 sosedoff/pgweb 容器。 此容器是適用於 PostgreSQL 資料庫的跨平臺 client,用於提供網頁式管理儀表板。 請考慮下列範例:
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...
上述程式代碼會根據 docker.io/sosedoff/pgweb
映像新增容器。 所有已註冊的 PostgresDatabaseResource 實例都會用來為每個實例建立組態檔,而且每個組態都會系結至 pgweb 容器書籤目錄。 如需詳細資訊,請參閱 PgWeb 文件:Server 連線書籤。
使用資料量添加 PostgreSQLserver 資源
若要將數據磁碟區新增至 PostgreSQLserver 資源,請在 PostgreSQLserver 資源上呼叫 WithDataVolume 方法:
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...
數據磁碟區用來將 PostgreSQLserver 數據保存在其容器生命週期之外。 資料卷會掛接在 PostgreSQLserver 容器中的 /var/lib/postgresql/data
路徑,當未提供 name
參數時,會生成一個隨機名稱。 如需有關資料卷的詳細資訊,以及為何相較於 系結掛接更受到偏好的原因,請參閱 Docker 文件:卷。
使用數據系結掛接新增 PostgreSQLserver 資源
若要將數據系結掛接新增至 PostgreSQLserver 資源,請呼叫 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...
重要
相較於 磁碟區,數據 系結掛 接的功能有限,可提供更佳的效能、可移植性和安全性,使其更適合生產環境。 不過,系結掛接允許直接存取和修改主機系統上的檔案,非常適合用於開發和測試需要即時變更的場景。
數據系結裝載依賴主計算機的檔案系統,在容器重新啟動時保存 PostgreSQLserver 數據。 數據綁定掛接會在 PostgreSQLserver 容器中的主機上掛接到 Windows 的 C:\PostgreSQL\Data
(或 Unix的 /PostgreSQL/Data
)。 如需資料系結掛接的詳細資訊,請參閱 Docker 檔:系結掛接。
使用 init 系結掛接新增 PostgreSQLserver 資源
若要將 init 系結掛接新增至 PostgreSQLserver 資源,請呼叫 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...
init 系結掛接依賴主計算機的文件系統,以容器 init 資料夾初始化 PostgreSQLserver 資料庫。 建立 postgres-data 資料夾之後,此資料夾用於初始化及執行任何可執行的shell腳本或 .sql 命令檔。 init 綁定掛載在 PostgreSQLserver 容器中主機上的 C:\PostgreSQL\Init
路徑上(或者在 Unix的 /PostgreSQL/Init
路徑上)。
使用參數新增 PostgreSQLserver 資源
當您想要明確提供容器映像所使用的使用者名稱和密碼時,您可以提供這些認證做為參數。 請考慮下列替代範例:
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...
如需提供參數的詳細資訊,請參閱
主機整合健康檢查
主機整合 PostgreSQL 會自動新增 PostgreSQLserver 資源的健康檢查。 健康檢查確認 PostgreSQLserver 正在運行,並且可以建立連線。
主機整合依賴 📦 AspNetCore.HealthChecks.Npgsql NuGet 套件。
Client 整合
若要開始使用 .NET AspirePostgreSQLclient 整合,請安裝 📦Aspire。Npgsqlclient-consuming 專案中的 NuGet 套件,也就是使用 PostgreSQLclient的應用程式專案。 PostgreSQL client 整合會註冊 NpgsqlDataSource 實例,讓您可用來與 PostgreSQL互動。
dotnet add package Aspire.Npgsql
新增 Npgsql client
在 client消費專案的 Program.cs 檔案中,針對任何 IHostApplicationBuilder 呼叫 AddNpgsqlDataSource 擴充方法來註冊 NpgsqlDataSource
,透過依賴注入容器來使用。 方法會採用連接名稱參數。
builder.AddNpgsqlDataSource(connectionName: "postgresdb");
提示
connectionName
參數必須符合在應用程式主專案中新增 PostgreSQLserver 資源時所使用的名稱。 如需了解更多資訊,請參閱 新增的 PostgreSQLserver 資源。
將 NpgsqlDataSource
新增至產生器之後,您可以使用相依性插入取得 NpgsqlDataSource
實例。 例如,若要從範例服務擷取數據源物件,請將其定義為建構函式參數,並確定已向相依性插入容器註冊 ExampleService
類別:
public class ExampleService(NpgsqlDataSource dataSource)
{
// Use dataSource...
}
如需相依性插入的詳細資訊,請參閱 .NET 相依性插入。
新增 Npgsql client 的索引鍵
在某些情況下,您可能想要以不同的連線名稱註冊多個 NpgsqlDataSource
實例。 若要註冊金鑰式 Npgsql 用戶端,請呼叫 AddKeyedNpgsqlDataSource 方法:
builder.AddKeyedNpgsqlDataSource(name: "chat");
builder.AddKeyedNpgsqlDataSource(name: "queue");
然後,您可以使用相依注入來擷取 NpgsqlDataSource
實例。 例如,若要從範例服務擷取連線:
public class ExampleService(
[FromKeyedServices("chat")] NpgsqlDataSource chatDataSource,
[FromKeyedServices("queue")] NpgsqlDataSource queueDataSource)
{
// Use data sources...
}
如需索引鍵服務的詳細資訊,請參閱 .NET 相依性插入:索引鍵服務。
配置
.NET Aspire PostgreSQL 整合提供多個組態方法和選項,以符合專案的需求和慣例。
使用連接字串
從 [ConnectionStrings
組態] 區段使用連接字串時,您可以在呼叫 AddNpgsqlDataSource 方法時提供連接字串的名稱:
builder.AddNpgsqlDataSource("postgresdb");
然後,連接字串將會從 [ConnectionStrings
組態] 區段擷取:
{
"ConnectionStrings": {
"postgresdb": "Host=myserver;Database=postgresdb"
}
}
如需詳細資訊,請參閱 ConnectionString。
使用組態提供者
.NET Aspire
PostgreSQL 整合支援 Microsoft.Extensions.Configuration。 它會使用 Aspire:Npgsql
金鑰,從 appsettings.json 或其他組態檔載入 NpgsqlSettings。 設定部分選項的範例 appsettings.json:
下列範例顯示 appsettings.json 檔案,可設定一些可用的選項:
{
"Aspire": {
"Npgsql": {
"ConnectionString": "Host=myserver;Database=postgresdb",
"DisableHealthChecks": false,
"DisableTracing": true,
"DisableMetrics": false
}
}
}
如需完整的 PostgreSQLclient 整合 JSON 架構,請參閱 Aspire。Npgsql/ConfigurationSchema。json。
使用內嵌委派
您也可以傳遞 Action<NpgsqlSettings> configureSettings
委託來內嵌設定部分或全部選項,例如停用健康檢查:
builder.AddNpgsqlDataSource(
"postgresdb",
static settings => settings.DisableHealthChecks = true);
健康檢查
根據預設,.NET.NET Aspire 整合會為所有服務啟用 健康檢查。 如需詳細資訊,請參閱 .NET.NET Aspire 整合概觀。
- 新增
NpgSqlHealthCheck
,以驗證是否可以針對基礎 Postgres 資料庫成功執行命令。 - 與
/health
HTTP 端點整合,其指定所有已註冊的健康情況檢查都必須通過,應用程式才能視為可接受流量
可檢視性和遙測
.NET .NET Aspire 整合會自動設定記錄、追蹤和計量組態,有時稱為 可觀察性的三大支柱。 如需整合可觀察性和遙測的詳細資訊,請參閱 .NET.NET Aspire 整合概觀。 視支援服務而定,某些整合可能只支援其中一些功能。 例如,某些整合支援記錄和追蹤,但不支援計量。 您也可以使用 組態 一節中呈現的技術來停用遙測功能。
伐木
.NET Aspire PostgreSQL 整合會使用下列記錄類別:
Npgsql.Connection
Npgsql.Command
Npgsql.Transaction
Npgsql.Copy
Npgsql.Replication
Npgsql.Exception
追蹤
.NET Aspire PostgreSQL 整合會使用 OpenTelemetry發出下列追蹤活動:
Npgsql
指標
.NET Aspire PostgreSQL 整合會使用 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 主機托管整合
若要將 PostgreSQL 資源部署至 Azure,請安裝 📦Aspire。好客。Azure。PostgreSQL NuGet 套件:
dotnet add package Aspire.Hosting.Azure.PostgreSQL
新增 AzurePostgreSQLserver 資源
安裝 .NET AspireAzurePostgreSQL 裝載整合之後,請在應用程式主機專案中呼叫 AddAzurePostgresFlexibleServer
擴充方法:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddAzurePostgresFlexibleServer("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
上述 AddAzurePostgresFlexibleServer
呼叫會將PostgresSQL server 資源設定為 AzurePostgres 彈性 Server。
重要
根據預設,AddAzurePostgresFlexibleServer
會設定 Microsoft Entra ID 驗證。 這需要變更需要連線到這些資源的應用程式。 如需詳細資訊,請參閱 Client 整合。
新增已驗證的 Npgsql Azureclient
在預設情況下,當您在您的 PostgreSQL 裝載整合中呼叫 AddAzurePostgresFlexibleServer
時,它會設定 📦Azure身分識別 NuGet 套件來啟用驗證:
dotnet add package Azure.Identity
您可以使用 client 整合和 Azure.Identity
來取用 PostgreSQL 連線:
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));
});
上述代碼段示範如何使用 Azure.Identity 套件中的 DefaultAzureCredential 類別,以 Microsoft Entra ID 進行驗證,並擷取令牌以聯機到 PostgreSQL 資料庫。 UsePeriodicPasswordProvider 方法可用來將令牌提供給連接字串產生器。