Aspire入门指南

Aspire是一个面向分布式应用的代码优先编排和可观测层,它提供一个平台来编排和管理你的服务、前端、数据库、队列、容器和云依赖。

构建一个MVP

安装Aspire

MacOS/Linux可以通过以下方式安装:

bash 复制代码
curl -sSL https://aspire.dev/install.sh | bash

Windows可以通过以下方式安装:

powershell 复制代码
irm https://aspire.dev/install.ps1 | iex

安装完成后可以通过以下命令检查:

bash 复制代码
aspire --version

详细可参照官方文档:Aspire官方文档

初始化项目

bash 复制代码
aspire new aspire-starter -n AspireApp -o AspireApp

过程如下:

bash 复制代码
使用 *.dev.localhost URL [y/N]: y
✅ 使用 *.dev.localhost URL 进行本地开发。
使用 Redis 缓存 [Y/n]: y
✅ 使用 Redis 缓存进行缓存。
是否要创建测试项目? [y/N]: y
选择测试框架 MSTest
✅ 使用 MSTest 进行测试。
📦 使用项目模板版本: 13.4.3
📦 Created or updated NuGet.config in the project directory with required package sources.
✅ 已在 C:\project\AspireApp 中成功创建项目。

Would you like to configure AI agent environments for this project? [Y/n]: y
🤖 Installed Aspire agent skills:
     Skills: aspire, aspire-deployment, aspire-init, aspire-monitoring, aspire-orchestration
     Locations: .agents/skills
✅ 智能体环境配置完成。

项目结构大致如下:

plaintext 复制代码
AspireApp/
├── .agents/skills/
│   ├── aspire/
│   ├── aspire-deployment/
│   ├── aspire-init/
│   ├── aspire-monitoring/
│   └── aspire-orchestration/
├── AspireApp.ApiService/
│   ├── Properties/
│   ├── Program.cs
│   ├── AspireApp.ApiService.csproj
│   ├── AspireApp.ApiService.http
│   ├── appsettings.json
│   └── appsettings.Development.json
├── AspireApp.AppHost/
│   ├── Properties/
│   ├── AppHost.cs
│   ├── AspireApp.AppHost.csproj
│   ├── appsettings.json
│   └── appsettings.Development.json
├── AspireApp.ServiceDefaults/
│   ├── Extensions.cs
│   └── AspireApp.ServiceDefaults.csproj
├── AspireApp.Tests/
│   ├── WebTests.cs
│   └── AspireApp.Tests.csproj
├── AspireApp.Web/
│   ├── Components/
│   │   ├── Layout/
│   │   │   ├── MainLayout.razor
│   │   │   ├── MainLayout.razor.css
│   │   │   ├── NavMenu.razor
│   │   │   └── NavMenu.razor.css
│   │   ├── Pages/
│   │   │   ├── Counter.razor
│   │   │   ├── Error.razor
│   │   │   ├── Home.razor
│   │   │   └── Weather.razor
│   │   ├── App.razor
│   │   ├── Routes.razor
│   │   └── _Imports.razor
│   ├── Properties/
│   ├── wwwroot/
│   │   ├── lib/bootstrap/dist/
│   │   ├── app.css
│   │   └── favicon.png
│   ├── Program.cs
│   ├── WeatherApiClient.cs
│   ├── AspireApp.Web.csproj
│   ├── appsettings.json
│   └── appsettings.Development.json
├── AspireApp.sln
├── aspire.config.json
└── nuget.config

将项目初始化好后,进入AspireApp目录,通过以下命令可以启动:

bash 复制代码
aspire run

点击仪表盘链接进入页面:

注意:创建项目时使用了Redis进行缓存,在Aspire中,这需要依赖本机docker环境

可以看到,当前Aspire应用中有三个资源,一个Redis、一个前端(Blazor)和一个后端(ASP.NET Core Web API)应用,现在尝试添加一个资源。

使用以下命令添加一个PostgreSQL:

bash 复制代码
aspire add postgres

AspireApp.AppHost/AppHost.cs 中加入以下代码:

csharp 复制代码
var builder = DistributedApplication.CreateBuilder(args);

var cache = builder.AddRedis("cache")
    .WithLifetime(ContainerLifetime.Persistent);

var db = builder.AddPostgres("postgres")
    .WithLifetime(ContainerLifetime.Persistent)
    .AddDatabase("mydb");

var apiService = builder.AddProject<Projects.AspireApp_ApiService>("apiservice")
    .WithHttpHealthCheck("/health");

builder.AddProject<Projects.AspireApp_Web>("webfrontend")
    .WithExternalHttpEndpoints()
    .WithHttpHealthCheck("/health")
    .WithReference(cache)
    .WaitFor(cache)
    .WithReference(apiService)
    .WaitFor(apiService);

builder.Build().Run();

再次启动就会看到Resources中多了一个postgres资源,其下有一个mydb的数据库。

注意:postgres也需要有docker环境,会创建一个容器。

实现一个简单的Todo

当前Aspire项目中有一个前端服务、一个后端服务、一个数据库和一个缓存。可以构建一个简单的应用了,这里尝试构建一个todo,项目目录下有.agent/skills,可以直接丢给智能体让其帮忙完成。

如下是我给智能体的描述:

当前是一个Aspire项目,相关skill在.agent/skills下,当前项目下管理了一个前端和后端项目,分别是apiservice和webfrontend,还管理了一个Postgres和Redis,根据这些内容帮我写一个简单的Todo应用,要求用上数据库和缓存。

示例代码:Aspire示例代码仓库

相关概念

AppHost

AppHost用来声明应用程序服务及关系,负责本地编排、服务发现、依赖注入和可观测性接入。Aspire强调一个"代码优先(code-first)"的模型,AppHost就是一个code-first的架构关系描述器。

例如在AppHost.cs中,定义了四个应用服务,并且使用WithReferenceWaitFor来声明相互之间的依赖关系,WithReference是需要应用另一个服务,WaitFor是需要等待另一个服务启动后启动。例如apiservice如果依赖一个数据库和一个缓存,使用了WithReferenceWaitFor,那么Aspire就会在启动apiservice之前把数据库和缓存的connection string自动注入并且确保数据库和缓存启动起来。

AppHost会自动启动所有服务,管理启动的顺序,进行服务发现,管理容器,统一日志,在Graph中也可以它们之间的依赖关系

可观测性接入就是指Aspire提供了一个Dashboard来进行分布式追踪、日志、服务拓扑图等,无需进行额外配置,AppHost自动接入Dashboard。

如果想让别的语言服务也接入Aspire的话,可以使用Language & runtime,详见languages-and-runtimes

Resources

Aspire中,资源包括

  • 人工智能服务:大型语言模型、人工智能端点和认知服务。
  • 缓存:Redis、内存缓存和分布式缓存解决方案。
  • 容器:用于数据库、消息代理和其他服务的 Docker 容器。
  • 数据库:SQL Server、PostgreSQL、MySQL、MongoDB 和其他数据存储。
  • 可执行文件:控制台应用程序、脚本和后台服务。
  • 框架:使用各种框架构建的 Web 应用程序、API 和微服务。
  • 消息服务:服务总线、RabbitMQ、Kafka 和其他消息系统。
  • 项目:C# 项目、Node.js 应用程序、Python 服务等等。
  • 存储:Blob 存储、文件系统和云存储服务。

资源的整个生命周期包括了服务发现、启动、健康检查和停止。

Health check

健康检查是一种确定资源是否准备好且正常运行的机制,健康检查有两种形式,一种是AppHost级别的健康检查,WaitFor中会进行健康检查,另一种是用作负载均衡的端点/health或/alive。

Named endpoints

Named endpoints的格式形如scheme://_endpointName.serviceName,endpointName对应的一个端口名,serviceName对应的一个服务名,本例中后端服务名为apiservice,默认端口名为空,其Named endpoints为https+http://apiservice

在前端AspireApp.Web模块的Program.cs注册HttpClient

csharp 复制代码
builder.Services.AddHttpClient<TodoApiClient>(client =>
    {
        client.BaseAddress = new("https+http://apiservice");
    });

Inner-loop networking

Aspire内部有一个工作的逻辑网络层,其中有四个元素,Endpoints、Proxies、Proxyless endpoints、Container networks,端点配置通过代理进行转发,转发到实际的地址,IsProxied配置为false则为无代理端点,不经过Aspire内部的代理转发,Aspire还为容器创建和管理专用网络,让容器在本地开发中能相互发现和通信。

为了能更好的理解内部的网络,官方也给出了一个示意图,如下:

图片来源:aspire.dev/fundamental...

参考

Aspire documentation home

相关推荐
tonydf44 分钟前
DotNet项目接入Copilot SDK简单案例
后端·.net·github copilot
加号31 小时前
【C#】VS2022 传统 ASP.NET Web 服务(.asmx)接口实现指南
前端·c#·asp.net
User_芊芊君子1 小时前
鸿蒙PC适配:Pinta GTK 图像编辑器鸿蒙 PC ArkWeb 适配全记录:从 .NET_GTK4 桌面到 HarmonyOS PC HAP
编辑器·.net·harmonyos
加号312 小时前
【C#】 文件与目录管理:创建、删除操作的技术解析
开发语言·c#
用户3952409988016 小时前
SqlSugar 连接 PostgreSQL 报错 42P01: relation does not exist 的排查与修复
c#
2601_9618752417 小时前
法考考试时间安排及科目|时间表|资料已整理
开发语言·c#·inverted-index·suffix-tree·sstable·r-tree·lsm-tree
ServBay17 小时前
你跟高级 C# 工程师的区别,就是这8个开发技巧
后端·c#·.net
2601_961875241 天前
法考备考计划表|学习计划|资料已整理
java·开发语言·学习·eclipse·tomcat·c#·hibernate
Y学院1 天前
C#游戏脚本开发全流程(Unity通用完整版)
游戏·unity·c#