Aspire 13

一個專案的開始

開發專案時,通常會在本地端進行,並結合 Database 和 Cache 等服務。目前常見的做法是使用 Docker 啟動 Database 或 Cache container 來建立本地測試環境,而非直接連線到公司提供的測試環境。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3.9'

services:
postgres:
image: postgres:16
container_name: my_postgres
restart: always
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- pg_data:/var/lib/postgresql/data

volumes:
pg_data: {}

以上面的例子來說,你需要先有以下的知識:

  • 你需要知道 docker 使用的基本知識
  • 你需要懂 docker-compose 的格式
  • 你需要知道 postgres container 所提供的設定資料種類與設定方式

當然,以現代結合 AI 的做法,以上的方式其實很簡單,不容易出問題 (以上範例也是直接讓 ChatGPT 給我的)。但如果你還需要更深入一點的操作,包含取得連線字串,放到系統中使用,或者是管理資料庫的生命週期,舉例來說如果有以下問題:

  • 資料庫什麼時候啟動?
  • 啟動後如果要重設的方式?
  • 如果有一個以上的服務需要使用資料庫,但是 schema 不一樣?
  • 假設有一個以上的服務需要用到資料庫,但是實際生產環境是不同的兩個 database ? 我該怎麼啟動兩個資料庫,然後使用不同的 Port ?
  • 怎麼樣讓資料庫已啟動就有相對應的 schema or data?

如果一個新進專案的工程師要了解以上服務的關聯性以及啟動方式,你需要將以上的資訊整理成一份 README,或者是寫好一個 script 來將以上的動作都一次處理完畢。但這又有其他問題:

  • README 要怎麼寫,才能讓新加入的成員很好理解?
  • script 要用什麼格式?Bash or Powershell?(如果遇到團隊有使用不同環境的電腦)
  • 如果遇到要存取檔案,路徑格式的表現方式?
  • 如果有使用到其他工具,還需要說明其他工具的安裝方式

所以,如果公司內沒有一個懂以上資訊或怎麼做的人,這些對團隊來說,都會是痛點。而且如果團隊成員會有不同想法,不同意見,以及考慮到人員異動,專案成員來來去去,情況就更複雜了。

當然,以上問題以現代的做法來講,你都可以讓 AI 來幫你處理掉以上的問題,你可以不需要找其他工具來處理,直接把以上問題都整理好,一次讓 AI 處理掉以上問題。如果有發生其他狀況,直接讓 AI 來幫你處理掉以上問題。但是,你每個專案可能都需要來一次。如果中途要修改,你還需要花一點時間測試與了解做法,這些,都是隱性成本 (人力 or Tokens 數)。

Aspire is glue

微軟認為,Aspire 這個工具是一個用來黏合其他服務的一個方式,而且是使用我們已經習慣的 C# 語言,搭配已經開發好的 NuGet Packages,你可以很快速的啟動資料庫,並且將連線字串直接注入到專案中使用,也不需要再管理連線字串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using Aspire.Hosting;

var builder = DistributedApplication.CreateBuilder(args);

// 建立 PostgreSQL 資料庫
var postgres = builder.AddPostgres("postgres")
.WithImage("postgres:16") // 指定版本
.WithEnvironment("POSTGRES_PASSWORD", "mypassword")
.WithEnvironment("POSTGRES_USER", "myuser")
.WithEnvironment("POSTGRES_DB", "mydb")
.WithDataVolume("pg_data");

// 建立資料庫實例,並產生 connection string
var postgresDb = postgres.AddDatabase("mydb");

// 建立 Sample.Api WebAPI 並注入資料庫 ConnectionString
builder.AddProject<Projects.Sample_Api>("sample-api")
.WithReference(postgresDb); // Aspire 會自動注入連線字串

builder.Build().Run();

以上的專案啟動後,還會有一個漂亮的 Dashboard 可以使用,裡面可以看所有服務的 Console Output,並且直接結合 OpenTelemetry,有 Tracing、Metric 等相關資訊可以檢視。

現在已經到 Aspire 13,是可以嘗試看看了