入门 .NET Aspire: 使用 .NET 简化云原生应用开发
经历多个版本之后,我们一直在朝着我们正在进行的理想目标之一取得进展。使 .NET 成为全球构建云原生应用程序最高效的平台之一。
我们与 Microsoft 的一些要求最苛刻的服务合作,这些服务对大多数应用程序来说都是闻所未闻的,这些服务支持数亿月活跃用户。与这些服务合作,确保我们满足他们的需求,确保我们拥有能够满足大规模云服务需求的基本功能。
我们投资了重要的技术和库,如运行状况检查、YARP、HTTP 客户端工厂和 gRPC。借助本机 AOT,我们正在努力实现性能和程序尺寸的最佳点,而 SDK 容器构建使将任何 .NET 应用放入容器并为现代云做好准备变得轻而易举,而无需开发人员进行任何思考或工作。
但我们从开发人员那里听到的是,我们需要做更多的事情。为云构建应用程序仍然太难了。开发人员越来越远离他们的业务逻辑,以及处理云复杂性最重要的事情。
为了帮助你简化云应用的复杂性,我们推出了...
.NET Aspire 是一个自信满满的技术栈,用于使用 .NET 构建可复原、可观察和可配置的云原生应用程序。它包括一组针对云原生增强的精选组件,默认情况下包括服务发现、遥测、复原能力和运行状况检查。结合复杂但简单的本地开发人员体验,.NET Aspire 可以轻松地在第 1 天和第 100 天发现、获取和配置云原生应用的基本依赖项,以及使用 .NET 8+ 的新应用和现有应用。
我们将发布带有 .NET 8 的 .NET Aspire 的第一个预览版,并将在明年春季作为 .NET 8 的一部分正式发布。它是 .NET 8 的一部分,并将与 .NET 一起进行版本(Docs、GitHub)。
.NET Aspire 之旅
首先,让我们浏览一下新的 .NET Aspire Starter 模板,并介绍所有功能,然后再在本文后面深入探讨。本部分旨在提供对话式概述,您可以按照该概述进行操作。你将需要最新的 .NET 8 和 Visual Studio 2022 预览版(17.9 预览版 1)。如果您使用的是 Linux 或 Mac,您仍然可以按照所有内容进行操作,但给出的一些工具示例尚不可用。
Visual Studio 解决方案简介
初学者应用旨在让你启动并运行一个可以试用的 .NET Aspire 解决方案。该应用由两个项目和一个 Redis 缓存组成。前端项目是一个 Blazor Web 应用程序,用于调用后端 API 以获取天气信息。
您会注意到两个您以前从未见过的新项目 <appname>.AppHost 和 <appname>.ServiceDefaults。
AppHost 项目将运行获取分布式应用程序所需的任何 .NET 项目、容器或可执行文件。在 Visual Studio 中,调试将附加到所有正在运行的项目,允许你单步执行应用程序中的每个服务。我们将在 后面的帖子 中更深入地研究这个项目以及其中的代码是什么样的。
ServiceDefaults 项目包含适用于应用中每个项目的通用以服务为中心的逻辑。这是配置服务发现、遥测和运行状况检查终结点等跨领域问题的地方。我们希望这在所有项目中保持一致,但也要理解团队和组织可能想要调整一些设置。项目中的共享代码是我们能找到的最容易发现和对开发人员友好的机制来实现这些目标。
Dashboard - 中心化的应用监控和探查
在 Visual Studio 中使用 F5 启动 .NET Aspire 初学者应用程序或通过命令行运行的 dotnet 将转到开发人员仪表板。此仪表板是调试分布式应用程序的重要工具,可显示服务的统一视图以及它们的日志、指标和跟踪。
此仪表板不仅仅是云原生应用程序的窗口;它是一个交互式平台,可为您的项目提供有价值的见解并突出显示任何错误,从而进行更深入的调查。下图显示了一个已识别错误的项目,由红点表示:
我们还可以看到所有项目的日志,甚至可以看到显示对天气页面的请求的分布式跟踪。跟踪是诊断分布式系统中问题不可或缺的工具。
开发人员仪表板是用于将所有开发时诊断数据汇集在一起的核心,并对开发计算机上的减速和错误进行故障排除。它使用与配置生产遥测系统(如 Grafana+Prometheus、Application Insights 等)时在生产中使用的所有相同开放标准。我们将在 本文后面 更深入地介绍仪表板。
几年前,我们进行了一个名为 Project Tye 的实验,该实验中的许多知识现在都可以在 .NET Aspire 中使用,包括我们在该实验中首次尝试的仪表板。如果你喜欢 Project Tye 并希望它继续下去,那么我们认为你会喜欢 .NET Aspire。
组件 Component
现在让我们开始看看这些项目有什么不同。首先,Web 项目有一个名称中带有 Aspire 的 NuGet 包
如果您继续操作并且没有看到此包,则可能是在创建项目时没有选中 使用 Redis 缓存 框。
此 NuGet 包就是我们所说的 .NET Aspire 组件。组件是将 SDK 配置为在云环境中运行的胶水库。每个组件必须:
- 提供 JSON Schema 进行配置,以在 appsettings.json 中提供语句完成。
- 利用可配置的弹性模式(如重试、超时和断路器)来最大限度地提高可用性。
- 暴露运行状况检查,使应用程序能够跟踪和响应远程服务的运行状况。
- 使用现代 .NET 抽象(ILogger、Meter、Activity)提供集成的日志记录、指标和跟踪。
- 提供扩展方法,将服务从 SDK 粘合 到 DI 容器,并为要注册的类型提供合适的生存期。
我们将在文章后面更详细地介绍组件。关键要点是,.NET Aspire 组件配置依赖项以满足一组要求,我们认为这些要求有助于消费者在云中取得成功。它们不会包装/隐藏实际的 SDK/库,而是充当粘合剂,以确保库配置了一组良好的默认值并正确注册到 DI。现在通常留给开发人员去实现。
代码 Code
现在,让我们看一下 Blazor 应用中调用天气 API 的代码,然后看一下我们之前讨论过的 AppHost 中的一些代码。首先,在我们的 Web 项目Program.cs中,您可以看到如下代码:
builder.Services.AddHttpClient<WeatherApiClient>(
client => client.BaseAddress = new("http://apiservice"));
这是将我们的 Web 前端配置为能够调用天气 API。但是它有一些不寻常的地方,即这个 apiservice 名称从何而来?为了回答这个问题,我们将首次查看我们的 AppHost 项目,这是该项目的Program.cs文件。
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedisContainer("cache");
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");
builder.AddProject<Projects.AspireApp_Web>("webfrontend")
.WithReference(cache)
.WithReference(apiservice);
builder.Build().Run();
执行此代码是因为 AppHost 是您的启动项目。它运行您的项目及其依赖项并适当地配置它们,以便它们进行通信。我们的目标之一是尽可能从开发人员流中删除端口和连接字符串。我们通过 服务发现 机制来实现这一点,该机制允许开发人员在进行 HTTP 调用时使用逻辑名称而不是 IP 地址和端口。您可以在此处看到,我将 API apiservice 命名为 apiservice,然后将其作为对前端的引用传递,然后在通过 IHttpClientFactory 进行 HTTP 调用时可以使用 apiservice 作为名称。由于与 Polly 项目的集成,使用此方法进行的调用还将自动重试和处理暂时性故障。
AppHost 设置应用依赖项和要求,而 .NET Aspire 工具满足开发循环中的依赖项和要求。
深入探索
组件 Component
我们将从组件开始深入研究。.NET Aspire 组件旨在解决我们从客户那里听到的云原生开发开始的痛苦,您必须正确掌握许多技术/配置,并且不清楚从哪条路径开始。我们自信于通过对组件需要提供的内容,要求所有组件至少提供复原默认值、运行状况检查、设置遥测以及与 DI 集成来帮助实现这一目标。为了强调这一点,让我们看看准备用于生产的应用程序可能会执行哪些操作来在其应用程序中配置 Redis:
- 将 Redis 包与 Redis 客户端库一起添加。
- 发现并添加运行状况检查库,以便您的应用能够响应 Redis 不可用。这经常被遗漏,但在实践中很有用。
- 将 Redis 添加到 DI 并配置连接字符串。这很棘手,因为您需要知道 Redis 客户端库类型应该具有的生存期。这是需要进行研究的。
- 配置 Redis 客户端库以将日志输出发送到遥测系统。
- 日志和指标是不同的,需要不同的管道。
- 确定所需的弹性策略和逻辑,并使用可以实施弹性策略的库(如 Poly)配置 Redis 或包装调用。这再次需要对 Redis 的功能进行研究,并了解您应该拥有哪些弹性策略,这通常不是您一开始就知道的,并导致人们在没有它的情况下交付,直到生产中出现某些问题,而这些内容本可以通过具有指数退避的重试策略来避免。
如果我们将其与使用 .NET Aspire 进行对比:
- 添加 .NET Aspire Redis 包。
- 在 Builder 上调用 AddRedis() 方法。
- (可选)覆盖 appSettings.json 中的默认配置(该配置现已架构化,以便您可以完成以发现可以设置的内容)。
.NET Aspire 组件经过精心设计,可为您提供最佳的生产就绪配置,而无需隐藏基础 SDK。在上述两个示例中,使用 Redis 的代码将始终使用相同的 Redis 客户端库和类型。
组件必须执行以下操作才能被视为可以使用:
- 提供详细的架构化配置。
- 设置运行状况检查以跟踪和响应远程服务运行状况。
- 提供默认的、可配置的复原模式(重试、超时等),以最大限度地提高可用性。
- 提供集成的日志记录、指标和跟踪,使组件可观察。
下面列出了我们的初始组件集,更多文档可在 .NET Aspire 组件概述 |Microsoft学习。
云独立的组件
Component | 说明 |
---|---|
PostgreSQL Entity Framework Core | 使用 Entity Framework Core 提供访问 PostgreSQL 的客户端库 |
PostgreSQL | 用来访问 PostgreSQL 的客户端库 |
RabbitMQ | 用来访问 RabbitMQ 的客户端库 |
Redis Distributed Caching | 分布式缓存中用来访问 Redis Cache 的客户端库 |
Redis Output Caching | 用于输出缓存的访问 Redis caches 的客户端库 |
Redis | 用于访问 Redis caches 的客户端库 |
SQL Server Entity Framework Core | 使用 Entity Framework Core 访问 SQL Server 的客户端库 |
SQL Server | 用于访问 SQL Server 数据库的客户端库 |
Azure 专用组件
Component | 说明 |
---|---|
Azure Blob Storage | 用于访问 Azure Blob Storage 的客户端库 |
Azure Cosmos DB Entity Framework Core | 用于使用 Entity Framework Core 访问 Azure Cosmos DB 数据库的客户端库 |
Azure Cosmos DB | 用于访问 Azure Cosmos DB 数据库的客户端库 |
Azure Key Vault | 用于访问 Azure Key Vault 的客户端库 |
Azure Service Bus | 用于访问 Azure Service Bus 的客户端库 |
Azure Storage Queues | 用于访问 Azure Storage Queues 的客户端库 |
现在,这些组件由 Microsoft 提供和发布。我们的目标是,随着云的变化和越来越多的图书馆希望拥有组件,成为 Aspire 组件的过程及其要求/最佳实践变得更加由社区驱动。
应用模型
通过 .NET Aspire 应用中的 AppHost 项目,可以使用自己喜欢的 .NET 语言(最初支持 C#)来表达应用程序的需求。它负责协调应用在开发计算机上的运行。
编排是 .NET Aspire 的一项核心功能,旨在简化云原生应用不同部分之间的连接和配置。NET Aspire 提供了有用的抽象,使你能够协调服务发现、环境变量和容器配置等问题,而无需管理低级别的实现细节。这些抽象还为具有许多组件和服务的应用程序提供了一致的设置模式。
.NET Aspire 编排有助于解决以下问题:
- 应用组合:定义构成应用程序的资源,包括 .NET 项目、容器、可执行文件或云资源。
- 服务发现 :确定不同资源之间的通信方式。
例如,使用 .NET Aspire,以下代码创建本地 Redis 容器资源(API 的项目资源),并在“webfrontend”项目中配置相应的连接字符串和 URL。
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedisContainer("cache");
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");
builder.AddProject<Projects.AspireApp_Web>("webfrontend")
.WithReference(cache)
.WithReference(apiservice);
builder.Build().Run();
webfrontend
项目现在可以向 http://apiservice 发出 HTTP 请求,而不必担心端口映射。Redis 连接字符串更加透明,因为 .NET Aspire 组件将 Redis 客户端配置为使用自动提供的连接字符串。这消除了开发流程中容易出错的大量设置来源,并简化了入门和入门流程。如果在生产中使用服务发现,即使只有默认的 Kubernetes 功能,这也将比手动配置更接近地反映生产环境。
我们的初始资源集如下:
内置资源
- Project: .NET 项目,例如 ASP.NET Core Web app
- Container: 容器,容器镜像,例如 Docker 镜像
- 可执行程序:可执行的文件
云无关的扩展
为相应资源添加 NuGet 包(组件)时,其中每个都可用。对于其中的每一个,都可以让 .NET Aspire 在开发过程中启动容器,或者通过连接字符串连接到现有/外部资源。
- Postgress
- RabbitMQ
- Redis
- SQL Server
Azure 专用扩展
为相应资源添加 NuGet 包(组件)时,这些方法中的每一个都可用。Azure 存储目前是这些资源中唯一支持运行本地容器的资源,其余资源需要实际 Azure 资源的连接信息。
- Azure Storage (blobs, Tables, Queues)
- Azure Cosmos DB
- Azure KeyVault
- Azure Redis 缓存
- Azure 服务总线
可以在 .NET Aspire 文档中找到有关业务流程工作原理的详细信息:.NET Aspire 业务流程概述 |Microsoft学习
开发者仪表板 Dashboard
.NET Aspire 仪表板仅在 AppHost 运行时可见,并在启动项目时自动启动。左侧导航提供了指向我们将在此处描述的仪表板不同部分的链接。此外,仪表板右上角的齿轮图标提供对设置页面的访问,该页面允许您配置仪表板体验。
- 项目:项目页面是仪表板的主页,它列出了应用程序中的所有项目资源。它的主要功能是向你显示每个项目的状态,并给你提供应用程序各个部分的URL。当项目记录错误时,它还会显示一个徽章,让您可以轻松地将问题归零。
- 容器:此页与 项目 页相同,但用于应用程序的容器资源。在上面的教程中,Redis 缓存容器将显示在此处。
- 可执行文件:此页面与 项目 页面相同,但用于应用程序的可执行文件资源。
- 日志:dashbaord 的 logs 部分提供对中心位置中应用程序所有部分的日志的访问。
- 项目日志:可以在此处查看 .NET 项目中日志记录提供程序的输出,可以在每个项目之间切换,每个日志严重性都用不同的颜色表示。
- 容器日志:此页面与项目日志相同,但适用于容器。
- 可执行文件日志:此页面与项目日志相同,但适用于可执行文件。
- 结构化日志:结构化日志页面提供所有日志的可筛选视图。结构化日志维护日志消息的属性,以便可以单独筛选/搜索它们,而其他日志页面将所有属性合并到单个字符串日志消息中。
- 跟踪 Trace:跟踪 页显示单个操作通过应用程序所有部分的路径,即分布式跟踪。此视图在查找瓶颈、速度变慢和其他诊断其他行为方面非常有价值,这些行为仅在使用整个系统而不是孤立使用时才会出现。我们在上面的教程部分中展示了跟踪视图的屏幕截图,重点介绍了如何在一个视图中使用 Redis 缓存、API 和前端查看单个操作。
- 指标 Metrics:指标页面显示应用程序的所有指标。
在此处了解有关仪表板的详细信息:.NET Aspire 仪表板 |Microsoft学习
可观察性
默认情况下,.NET Aspire 应用程序是可观察的。出色的可观测性意味着你可以从正在运行的应用收集的所有数据中确定解决方案中发生的情况,尤其是在中断期间。特别是来自日志、指标和跟踪。如果您无法确定正在发生的事情,那么仅仅拥有日志和指标并不能使整个系统可观察,您需要在正确的时间以正确的视图获得正确的数据。
这意味着,要使应用可观察,则:
- 分布式应用程序的所有部分都需要以您可以使用的方式提供数据,包括 .NET 本身、您使用的库和您自己的应用程序代码。
- 该数据需要发送到您可以访问的地方。
- 查看/查询/理解数据的工具需要存在。
在 .NET 中,我们一直在越来越多地投资于开放遥测作为数据格式,采用开放遥测命名和数据结构,以及开放遥测协议 (OTLP),用于将数据从应用程序中获取并进入工具生态系统。
在 .NET Aspire 中,我们默认在 ServiceDefaults 项目中提供连接 Open Telemetry 的代码。我们之所以使用共享代码,是因为有一些约定,例如运行状况终结点的名称,我们预计某些人会希望为其项目或公司自定义这些约定。在试验时,我们发现共享代码为定义人们可以调整的这些类型的默认值提供了更好的体验,而不是将它们放在具有配置设置的库中。
.NET Aspire 还提供了我们上面提到的开发人员仪表板,它为你提供应用中的所有日志、指标和跟踪。仪表板的突出功能之一是“跟踪”视图,它提供通过应用的请求的分布式跟踪。在下面的示例中,我们向Aspire Starter App模板的天气页面发出了请求。您可以看到请求如何从前端转到 Redis 缓存,以查看数据是否被缓存(DATA redis GET 行),然后因为缓存中没有数据,它会调用后端 API,最后缓存该数据。
这种类型的视图使查找诸如用户操作之类的内容,这些操作会导致系统中的路径效率低下。您将能够立即看到诸如正在进行的多个数据库调用或正在减慢系统其他部分速度的单个服务之类的内容。如果没有此类数据和数据视图,可能很难发现这些类型的问题。
服务发现
构建任何分布式应用程序的关键部分是调用远程服务的能力。作为 .NET Aspire 的一部分,我们构建了一个新的服务发现库 Microsoft.Extensions.ServiceDiscovery。此库提供客户端服务发现和负载均衡的核心抽象和各种实现,可实现与 HttpClientFactory 和 YARP 的无缝集成,以及在已部署的 Kuberentes 和 Azure 容器应用环境中的无缝集成。
在此处了解有关服务发现的详细信息:.NET Aspire 中的服务发现
部署 .NET Aspire 应用
.NET Aspire 应用程序的最终项目是可部署到云环境的 .NET 应用和配置。借助 .NET Aspire 强大的容器优先思维,.NET SDK 本机容器生成可作为将这些应用轻松发布到容器的宝贵工具。
虽然 .NET Aspire 本身本身并不提供将应用程序部署到最终目标的直接机制,但如上所述的应用程序模型了解应用程序、其依赖项、配置以及与每个服务的连接的所有信息。应用程序模型可以生成一个清单定义,该定义描述了工具可以使用、增强和构建部署的所有这些关系和依赖关系。
通过此清单,我们可以使用 Azure 容器应用以最简单、最快的方式将 .NET Aspire 应用程序导入 Azure。使用 Azure 开发人员 CLI 和 .NET Aspire 中的新功能,这些组合体验使你能够快速检测 .NET Aspire 环境、了解应用程序,并在一个步骤中立即预配和部署 Azure 资源。
注意:此视频的某些部分已加快速度。aspire-starter 应用通常需要 ~5 分钟来预配和部署
正如在上面的视频中看到的,这是使用 .NET Aspire 从代码到云的最快方法之一。我们将继续发展这种部署 .NET Aspire 应用的功能,从而扩展 Visual Studio 发布机制等工具的部署便利性,利用相同的基础清单并与 Azure 开发人员 CLI 集成,直接从你最喜欢的 IDE 开始!
Azure 开发人员 CLI 还可以从清单创建 bicep,以允许开发人员和平台工程师审核或扩充部署过程。
我们希望这成为许多 IaC 系统集成的关键组件。有关 .NET Aspire 应用的清单和部署的详细信息,请参阅:.NET Aspire 清单格式 – .NET |Microsoft学习
现存应用
到目前为止,我们已经在这篇博文中展示了许多新应用程序,但 .NET Aspire 也可以与现有应用程序一起使用,因为可以增量采用堆栈的各个部分。
首先,.NET Aspire 是 .NET 8 的一部分。因此,在尝试使用堆栈的任何部分之前,您需要进行升级。我们在此处提供了工具和指南来帮助你:升级助手 | .NET (microsoft.com)。如果要使用 Visual Studio 工具,则还需要 Visual Studio 的最新预览版,在撰写本文时为 17.9。
完成此操作后,可以在 Visual Studio 中右键单击项目 -> 并选择 添加 -> Aspire Orchestrator 支持。
然后,系统将提示您确认项目和操作。
这将创建一个 AppHost 和 ServiceDefaults 项目,您选择的项目将已添加到 AppHost。您现在可以启动 AppHost 项目,并将看到开发人员仪表板。在这里,您可以添加对 ServiceDefaults 项目的引用,并在应用程序构建器上调用 AddServiceDefaults() 方法。这将为此项目设置开放遥测、运行状况检查终结点、服务发现和默认复原模式。
不使用 Visual Studio 时,仍可以使用 dotnet new 将 AppHost 和 ServiceDefaults 项目添加到现有解决方案,但它们不会像上面的示例中那样引用现有项目。
现在,如果您使用的是具有组件的任何服务,则可以切换到 .NET Aspire 组件。这可能意味着,如果您已经自行设置了组件的功能,则可以删除一些显式配置。还可以自由使用任何 .NET 8 应用中的组件,而无需业务流程。这将使你能够复原并应用于组件的其他配置,但你不会获得 .NET Aspire 的其余部分,例如仪表板、服务发现以及自动端口、URL 或连接字符串。
总结
今天,我们非常高兴能向你提供 .NET Aspire 的第一个预览版。基于坚如磐石的基础知识和 .NET 8 中令人难以置信的高效 API 界面,我们相信你会喜欢使用 .NET Aspire 构建云原生应用的生产力。
立即开始使用以下资源:
我们还有一些示例展示了一些我们认为有趣的事情:
- 使用 .NET 后端的节点前端:https://github.com/dotnet/aspire-samples/tree/main/samples/AspireWithNode
- DAPR 集成:https://github.com/dotnet/aspire-samples/tree/main/samples/AspireWithDapr
- 完全使用Aspire运行的 eShop 示例应用程序:https://github.com/dotnet/eshop
最重要的是,我们想听听什么对你有用,什么我们可以改进。.NET Aspire 是 .NET 平台和基础的一部分,是与该平台并驾齐驱的开源项目。在 https://github.com/dotnet/aspire 与我们互动。
标签:组件,入门,Redis,应用程序,Azure,Aspire,NET From: https://www.cnblogs.com/haogj/p/18112437