.NET Aspire PostgreSQL 整合
PostgreSQL 是一個強大的開放原始碼對象關係資料庫系統,具有多年的積極開發,因此其可靠性、功能強固性和效能享有盛譽。
.NET Aspire
PostgreSQL 整合可讓您連線到現有的 PostgreSQL 資料庫,或使用 docker.io/library/postgres
從 建立新的實例。
託管整合
主機整合 PostgreSQL 將 PostgreSQL 伺服器視為 PostgresServerResource 類型。 若要存取此類型和 API,並將它新增至 📦Aspire中的 HostingPostgreSQL NuGet 套件,在 應用程式主機 專案中。
dotnet add package Aspire.Hosting.PostgreSQL
如需詳細資訊,請參閱 dotnet add package 或 在 .NET 應用程式中管理套件相依性。
新增 PostgreSQL 伺服器資源
在應用程式主機專案中,呼叫 builder
實例上的 AddPostgres 以新增 PostgreSQL 伺服器資源,然後在 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
映像所示,它會在本機計算機上建立新的 PostgreSQL 伺服器實例。
PostgreSQL 伺服器和 PostgreSQL 資料庫實例的參考(postgresdb
變數)可用來將相依性新增至 ExampleProject
。
PostgreSQL 伺服器資源包括默認認證,其 username
是 "postgres"
,並使用 CreateDefaultPasswordParameter 方法隨機生成 password
。
WithReference 方法會在名為 ExampleProject
的 "messaging"
中設定連接。 如需詳細資訊,請參閱 容器資源生命週期。
提示
如果您想要連線到現有的 PostgreSQL 伺服器,請改為呼叫 AddConnectionString。 如需詳細資訊,請參閱 參考現有資源。
新增 PostgreSQL pgAdmin 資源
使用 PostgreSQL 方法將 builder
資源新增至 AddPostgres
時,您可以將呼叫鏈結至 WithPgAdmin
以新增 dpage/pgadmin4 容器。 此容器是適用於 PostgreSQL 資料庫的跨平臺用戶端,可提供 Web 型系統管理員儀錶板。 請考慮下列範例:
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
映像新增容器。 容器可用來管理 PostgreSQL 伺服器和資料庫資源。
WithPgAdmin
方法用於新增容器,提供 PostgreSQL 資料庫的網頁式管理儀表板。
新增 PostgreSQL pgWeb 資源
使用 PostgreSQL 方法將 builder
資源新增至 AddPostgres
時,您可以將呼叫鏈結至 WithPgWeb
以新增 sosedoff/pgweb 容器。 此容器是適用於 PostgreSQL 資料庫的跨平臺用戶端,可提供 Web 型系統管理員儀錶板。 請考慮下列範例:
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 連線書籤。
新增具備資料量的 PostgreSQL 伺服器資源
若要將數據磁碟區新增至 PostgreSQL 伺服器資源,請在 PostgreSQL 伺服器資源上呼叫 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...
數據磁碟區用來將 PostgreSQL 伺服器數據保存在其容器生命週期之外。 數據磁碟區會掛接在 PostgreSQL 伺服器容器的 /var/lib/postgresql/data
路徑,若未提供 name
參數,則會隨機生成名稱。 如需有關資料卷的詳細資訊,以及為何相較於 系結掛接更受到偏好的原因,請參閱 Docker 文件:卷。
使用數據系結掛接新增 PostgreSQL 伺服器資源
若要將數據系結掛接新增至 PostgreSQL 伺服器資源,請呼叫 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...
重要
相較於 磁碟區,數據 系結掛 接的功能有限,可提供更佳的效能、可移植性和安全性,使其更適合生產環境。 不過,系結掛接允許直接存取和修改主機系統上的檔案,非常適合用於開發和測試需要即時變更的場景。
數據系結掛接依賴主計算機的檔案系統,在容器重新啟動時保存 PostgreSQL 伺服器數據。 數據掛載會被掛載到 PostgreSQL 伺服器容器中主電腦的 Windows 中的 C:\PostgreSQL\Data
路徑上(或 /PostgreSQL/Data
上的 Unix路徑上)。 如需資料系結掛接的詳細資訊,請參閱 Docker 檔:系結掛接。
使用 init 綁定掛載新增 PostgreSQL 伺服器資源
若要將 init 系結掛接新增至 PostgreSQL 伺服器資源,請呼叫 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 資料夾初始化 PostgreSQL 伺服器資料庫。 建立 postgres-data 資料夾 C:\PostgreSQL\Init
上(或 Unix上 /PostgreSQL/Init
)。
使用參數新增 PostgreSQL 伺服器資源
當您想要明確提供容器映像所使用的使用者名稱和密碼時,您可以提供這些認證做為參數。 請考慮下列替代範例:
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 會自動為 PostgreSQL 伺服器資源新增健康檢查。 健康檢查會確認 PostgreSQL 伺服器正在運行,而且可以建立連線。
主機整合依賴 📦 AspNetCore.HealthChecks.Npgsql NuGet 套件。
Client 整合
若要開始使用 .NET AspirePostgreSQL 用戶端整合,請在取用 PostgreSQL 用戶端的應用程式專案中安裝 📦AspireNpgsql NuGet 套件。 PostgreSQL 用戶端整合會註冊 NpgsqlDataSource 實例,您可用來與 PostgreSQL互動。
dotnet add package Aspire.Npgsql
新增 Npgsql 用戶端
在您的客戶端消費專案的 Program.cs 檔案中,呼叫任何 IHostApplicationBuilder 上的 AddNpgsqlDataSource 擴充方法,以便註冊 NpgsqlDataSource
,以供相依性注入容器使用。 方法會採用連接名稱參數。
builder.AddNpgsqlDataSource(connectionName: "postgresdb");
提示
connectionName
參數必須符合在應用程式主專案中新增 PostgreSQL 伺服器資源時所使用的名稱。 如需詳細資訊,請參閱 新增 PostgreSQL 伺服器資源。
將 NpgsqlDataSource
新增至產生器之後,您可以使用相依性插入取得 NpgsqlDataSource
實例。 例如,若要從範例服務擷取數據源物件,請將其定義為建構函式參數,並確定已向相依性插入容器註冊 ExampleService
類別:
public class ExampleService(NpgsqlDataSource dataSource)
{
// Use dataSource...
}
如需相依性插入的詳細資訊,請參閱 .NET 相依性插入。
新增具有鍵控功能的 Npgsql 用戶端
在某些情況下,您可能想要以不同的連線名稱註冊多個 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。 它會使用 NpgsqlSettings 金鑰,從 appsettings.json 或其他組態檔載入 Aspire:Npgsql
。 設定部分選項的範例 appsettings.json:
下列範例顯示 appsettings.json 檔案,可設定一些可用的選項:
{
"Aspire": {
"Npgsql": {
"ConnectionString": "Host=myserver;Database=postgresdb",
"DisableHealthChecks": false,
"DisableTracing": true,
"DisableMetrics": false
}
}
}
如需完整的 PostgreSQL 用戶端整合 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
新增 AzurePostgreSQL 伺服器資源
安裝 .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 伺服器資源設定為 AzurePostgres 彈性 Server。
重要
根據預設,AddAzurePostgresFlexibleServer
會設定 Microsoft Entra ID 驗證。 這需要變更需要連線到這些資源的應用程式。 如需詳細資訊,請參閱 Client 整合。
新增已驗證的 Npgsql 用戶端 Azure
在預設情況下,當您在您的 AddAzurePostgresFlexibleServer
裝載整合中呼叫 PostgreSQL 時,它會設定 📦Azure身分識別 NuGet 套件來啟用驗證:
dotnet add package Azure.Identity
您可以使用用戶端整合和 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));
});
上述代碼段示範如何使用 DefaultAzureCredential 套件中的 Azure.Identity 類別,以 Microsoft Entra ID 進行驗證,並擷取令牌以聯機到 PostgreSQL 資料庫。 UsePeriodicPasswordProvider 方法可用來將令牌提供給連接字串產生器。