后端与接口
需要本地编排多个 .NET 服务…
适用于 .NET 云原生应用的本地多服务编排、服务发现、共享配置与本地可观测性。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要本地编排多个 .NET 服务、数据库特定
解决思路
- 在 `AppHost/Program.cs` 中用 `DistributedApplication.CreateBuilder(args)` 创建 `DistributedApplicationBuilder`,在 AppHost 中声明所有基础设施资源与应用项目,最后调用 `builder.Build().Run()`。
- 用 Aspire 集成添加基础设施资源:`builder.AddPostgres("postgres").WithPgAdmin().AddDatabase("myappdb")`、`builder.AddRedis("redis").WithRedisInsight()`、`builder.AddRabbitMQ("messaging").WithManagementPlugin()`。
- 用 `AddProject<Projects.MyApp_Api>("api")` 与 `AddProject<Projects.MyApp_Worker>("worker")` 将应用项目加入 AppHost;用 `WithReference(postgres)`、`WithReference(redis)`、`WithReference(rabbitmq)` 注入依赖资源,用 `WithExternalHttpEndpoints()` 暴露外部 HTTP 端点。
- 让 AppHost 只负责本地开发/构建期编排;不要部署 AppHost 进程本身。生产部署使用 `aspire publish` 生成 docker-compose / Kubernetes manifests,或使用 `aspire deploy` 直接部署(例如 Azure Container Apps)。
- 创建 `ServiceDefaults/Extensions.cs`,实现 `AddServiceDefaults(this IHostApplicationBuilder builder)`,在其中调用 `builder.ConfigureOpenTelemetry()`、`builder.AddDefaultHealthChecks()`、`builder.Services.AddServiceDiscovery()`。
- 在 `AddServiceDefaults` 中配置 `ConfigureHttpClientDefaults`,对 HttpClient 调用 `http.AddStandardResilienceHandler()` 与 `http.AddServiceDiscovery()`。
- 让 `ConfigureOpenTelemetry` 配置日志、指标(ASP.NET、HttpClient、Runtime)与追踪(ASP.NET、HttpClient、EF Core),并在配置了 OTLP 时导出 OTLP。
- 让 `AddDefaultHealthChecks` 添加名为 `self` 的 liveness 健康检查,并打上 `["live"]` 标签。
- 在每个服务项目的 `Program.cs` 中调用 `builder.AddServiceDefaults()`,复用 OpenTelemetry、健康检查、服务发现与韧性配置;不要逐服务手动配置这些内容。
- 通过 Aspire 集成访问资源,例如 `builder.AddNpgsqlDbContext<AppDbContext>("myappdb")`、`builder.AddRedisDistributedCache("redis")`,让连接字符串、健康检查与追踪自动注入;不要硬编码连接字符串。
- 在服务中调用 `app.MapDefaultEndpoints()` 映射默认健康检查端点,再调用 `app.Run()`。
- 配置服务间通信:在 AppHost 中让调用方项目引用被调用方项目,例如 `paymentApi = builder.AddProject<Projects.PaymentApi>("payment-api").WithReference(orderApi)`,使 `paymentApi` 能发现 `orderApi`。
- 在调用方服务中使用服务发现注册 HttpClient:`builder.Services.AddHttpClient<OrderClient>(client => { client.BaseAddress = new Uri("https+http://order-api"); });`,通过逻辑服务名 `https+http://order-api` 访问。
- 采用推荐解决方案结构:`MyApp.slnx` 包含 `MyApp.AppHost/Program.cs`、`MyApp.ServiceDefaults/Extensions.cs`、`src/MyApp.Api`、`src/MyApp.Worker`、`tests/MyApp.Api.Tests`。
- 本地开发数据库使用 Aspire `AddPostgres()` / `AddSqlServer()` 等集成。
- 服务发现使用 Aspire 内置服务发现。
- 共享服务配置使用 ServiceDefaults 项目。
- 本地开发可观测性使用 Aspire dashboard(自动配置 tracing/logging/metrics),不要为此在本地额外搭建 Seq/Grafana。
- 本地多服务开发使用 Aspire AppHost 编排;单项目本地开发可直接 `dotnet run`,Aspire 可选。
- 生产部署使用 `aspire publish`(生成 compose/K8s manifests)或 `aspire deploy`(例如 ACA);绝不把 AppHost 本身作为生产运行时。
适用边界 · 注意事项
- 单项目本地开发、无需多服务编排时,不必引入 Aspire,直接 `dotnet run` 即可。
- 不要在生产环境运行或部署 AppHost 可执行文件;它只是开发/构建期工具。
- 不要硬编码连接字符串或跳过 ServiceDefaults 去逐服务手动配置 OpenTelemetry/健康检查。