Dapr 与 .NET Aspire 结合使用获得无与伦比的本地开发体验

dapr,net,aspire · 浏览次数 : 54

小编点评

## .NET Aspire 与 Dapr 之间的配合 .NET Aspire 和 Dapr 是开发分布式应用程序的关键工具,它们可以协同工作以提供可视化和状态存储功能。以下是如何它们结合的: * **DaprSidecar**:`WithDaprSidecar()` 方法允许您将任何类型的组件(如状态存储和 pub/sub)与应用程序绑定到 Dapr Sidecar。 * **YAML 代码配置**:您可以使用 YAML 代码在 application.yml 中配置 Dapr 中的组件,例如状态存储、pub/sub 和资源。 * **资源配置**:您可以使用 `WithDaprSidecar()` 等方法向 Sidecar 配置资源,例如弹性策略。 * **环境变量**:您可以通过环境变量配置 Dapr 中的组件,例如端口号。 **示例代码:** ```csharp // Configure Dapr Sidecar with state store and pub/sub builder.AddDaprSidecar(new DaprSidecarOptions { ResourcesPaths = [Path.Combine("..", "resources")], }); // Configure additional Dapr components builder.AddDaprSidecar(new DaprSidecarOptions { // ... }); ``` ** benefits of using Dapr with .NET Aspire:** * **可视化:**Dapr 提供图表和仪表板,可以实时跟踪应用程序的性能和状态。 * **状态存储:**Dapr 支持状态存储,可以保持应用程序状态并从服务器上获取。 * **日志:**Dapr 可以收集应用程序的日志信息,包括请求和响应。 * **指标:**Dapr 可以收集应用程序的指标信息,例如性能和资源使用。 **总结:** .NET Aspire 与 Dapr 是开发分布式应用程序的强大工具,可以提供可视化、状态存储和日志功能。通过使用 DaprSidecar 和 YAML 代码,您可以轻松地将任何类型的组件与应用程序绑定到 Dapr Sidecar,以创建可维护的分布式应用程序。

正文

Dapr 提供了一组构建块,用于抽象分布式系统中常用的概念。这包括服务、缓存、工作流、复原能力、机密管理等之间的安全同步和异步通信。不必自己实现这些功能,可以消除样板降低复杂性,并允许您专注于开发业务功能。

在您的时间有限并且您只想进行实验的情况下,在Dapr初始设置上花费大量时间可能会令人沮丧。更不用说你尚未确定对本地开发体验(故障排除、调试、载入等)的影响。也许你的一些同事最初会不情愿,并认为你正在让他们的工作比现在更复杂。

本文将向你展示如何将 Dapr 与 .NET Aspire 结合使用,以获得无与伦比的本地开发体验。我们将创建一些 ASP.NET 核心和Node.js服务,这些服务将利用服务调用状态管理和发布/订阅。好处是:

  • 通过编译时常量、可测试代码表示分布式系统。
  • 集中式 OpenTelemetry Web 仪表板,用于浏览跟踪、日志和指标。
  • 一种将 Dapr sidecar 附加到应用程序的简单方法。
  • 很少或没有 YAML 配置文件。

使用 .NET Aspire for Dapr 将减少开发人员的入门时间。他们可以专注于使用 Dapr 进行功能开发,并花更少的时间设置本地环境。由于与 OpenTelemetry 的集成,可以更轻松地在本地对多个应用程序之间的交互进行故障排除,这通常是在部署代码后在云环境中才能获得的。


具有 .NET Aspire 的 Dapr 分布式系统示例

image

使用 .NET Aspire 进行 Dapr 实验的目标是创建三个服务和 .NET Aspire 主机项目,后者充当业务流程协调程序:

  1. Alice,一个 ASP.NET 核心服务,它使用 Dapr 的服务调用从另一个服务检索天气数据,并使用状态存储对其进行缓存。
  2. Bob 是一个 ASP.NET Core 服务,它返回虚假的天气数据,然后使用 pub/sub 发布“请求天气预报”事件。
  3. Carol,一个 Node.js Express Web 应用程序,订阅“请求天气预报”事件。

可在此 GitHub 存储库找到可以使用的完整代码 .自述文件将指导您安装必备组件并启动服务。下面的代码是 .NET Aspire 主机项目,我们在其中声明这些服务、Dapr 组件及其关系,不涉及 YAML:

using Aspire.Hosting.Dapr;
using Microsoft.Extensions.Hosting;

var builder = DistributedApplication.CreateBuilder(args);

var stateStore = builder.AddDaprStateStore("statestore");
var pubSub = builder.AddDaprPubSub("pubsub");

builder.AddProject<Projects.AspireDaprDemo_AliceService>("alice")
     .WithDaprSidecar(new DaprSidecarOptions
     {
         // Loads the resiliency policy for service invocation from alice to bob
         ResourcesPaths = [Path.Combine("..", "resources")],
     })
     .WithReference(stateStore)
     .WithReference(pubSub);

builder.AddProject<Projects.AspireDaprDemo_BobService>("bob")
     .WithDaprSidecar()
     .WithReference(stateStore)
     .WithReference(pubSub);

builder.AddNpmApp("carol", Path.Combine("..", "AspireDaprDemo.CarolService"), "watch")
     .WithHttpEndpoint(port: 3000, env: "PORT")
     .WithEnvironment("NODE_TLS_REJECT_UNAUTHORIZED", builder.Environment.IsDevelopment() ? "0" : "1")
     .WithDaprSidecar()
     .WithReference(stateStore)
     .WithReference(pubSub);

builder.Build().Run();

启动后,Aspire 会启动所有服务,并在仪表板中提供分布式系统的完整视图

image

在此示例中,Alice 服务公开触发上述交互的终结点。调用此终结点时,OpenTelemetry 跟踪如下所示:/weatherforecast

image

加入开发团队的开发人员可以快速了解分布式系统的不同组件如何相互交互。在此屏幕截图中,我们可以看到 flky Bob 服务返回错误,并且 Dapr 自动重试该操作。与 Dapr 提供的默认 Zipkin 实例相比,.NET Aspire 提供了一种更好的方法来可视化 OpenTelemetry 跟踪,因为跟踪不仅在视觉上更清晰,而且仪表板还包括日志和指标。

image

带有 .NET Aspire 的 Dapr 无需配置且易于使用

通常,要配置 Dapr,您需要创建 YAML 配置文件来描述应用程序、sidecar 和网络详细信息(如 TCP 端口)。对于 .NET Aspire,这不是必需的。

Alice 和 Bob 之间的通信(他们的名字是在 Aspire 主机项目中声明的)非常简单,这要归功于 Dapr SDK。

// Otherwise, get a fresh weather forecast from the flaky service "bob" and cache it
var forecasts = await client.InvokeMethodAsync<WeatherForecast[]>(HttpMethod.Get, "bob", "weatherforecast");

未在appsettings.json和环境变量中配置 URL。使用服务名称bob是唯一必需的常量。Dapr 负责将请求路由到正确的服务。

状态存储和 pub/sub 也是如此。只有 Dapr sidecar 知道连接详细信息,因此应用程序无需担心它们。这避免了繁琐的配置文件管理。想象一下,在分布式系统中有 10 个服务,以及 4 个环境:本地环境、dev 环境、stg 环境和 prod。这可能表示要维护的 40 个潜在配置文件,以及数十个 URL 和连接字符串。多亏了 Dapr,您再也不用担心这个问题了。

使用状态存储和 pub/sub 同样简单:

// Retrieve the weather forecast from the state store "statestore" declared in the Aspire host
var cachedForecasts = await client.GetStateAsync<CachedWeatherForecast>("statestore", "cache");

// [...]
// Save the weather forecast in the state store under the key "cache"
await client.SaveStateAsync("statestore", "cache", new CachedWeatherForecast(forecasts, DateTimeOffset.UtcNow));

// Publish an event "WeatherForecastMessage" to the pub/sub "pubsub" declared in the Aspire host, with the topic "weather"
await client.PublishEventAsync("pubsub", "weather", new WeatherForecastMessage("Weather forecast requested!"));


这是订阅“天气”主题的 Carol 服务的片段。请记住,.NET Aspire 和 Dapr 都与语言无关:

// Events are received through HTTP POST requests (push delivery model)
app.post("/subscriptions/weather", (req, res) => {
   console.log("Weather forecast message received:", req.body.data);
   res.sendStatus(200);
});

.NET Aspire 如何与 Dapr 配合使用?

.NET Aspire 在资源上使用WithDaprSidecardapr,该方法指示 启动可执行文件的实例。

// [...]
     .WithDaprSidecar()
     .WithReference(stateStore)
     .WithReference(pubSub);

Dapr传递的参数取决于服务引用的组件数以及在调用上述方法期间可能传递的选项。

这里要记住两个关键点:

  • .NET Aspire 中内置组件(如状态存储和 pub/sub)的 YAML 代码在临时文件夹中自动生成。
  • 默认情况下,会分配随机端口,因此您不必记住它们或担心可能的冲突。

如果您想了解详细信息,可以在 .NET Aspire 源代码中的 DaprDistributedApplicationLifecycleHook 类中看它是如何实现的。随后,编排的应用程序被传递环境变量,允许 Dapr SDK 与 sidecar 进行通信。这可以从 Aspire 仪表板上的资源详细信息中看出:

image

处理更复杂的 Dapr 场景

在此实验中,我们使用了 .NET Aspire 本机支持的两个 Dapr 组件。但是,可以使用以下方法AddDaprComponent 声明其他类型的组件:

var stateStore = builder.AddDaprStateStore("statestore");
var pubSub = builder.AddDaprPubSub("pubsub");

还可以声明资源,例如弹性策略,并将它们分配给 sidecar:

builder.AddProject<Projects.AspireDaprDemo_AliceService>("alice")
     .WithDaprSidecar(new DaprSidecarOptions
     {
         // Loads the resiliency policy for service invocation from alice to bob
         ResourcesPaths = [Path.Combine("..", "resources")],
     })
     .WithReference(stateStore)
     .WithReference(pubSub);

builder.AddProject<Projects.AspireDaprDemo_BobService>("bob")
     .WithDaprSidecar()
     .WithReference(stateStore)
     .WithReference(pubSub);

builder.AddNpmApp("carol", Path.Combine("..", "AspireDaprDemo.CarolService"), "watch")
     .WithHttpEndpoint(port: 3000, env: "PORT")
     .WithEnvironment("NODE_TLS_REJECT_UNAUTHORIZED", builder.Environment.IsDevelopment() ? "0" : "1")
     .WithDaprSidecar()
     .WithReference(stateStore)
     .WithReference(pubSub);


相关链接

与Dapr 与 .NET Aspire 结合使用获得无与伦比的本地开发体验相似的内容:

Dapr 与 .NET Aspire 结合使用获得无与伦比的本地开发体验

Dapr 提供了一组构建块,用于抽象分布式系统中常用的概念。这包括服务、缓存、工作流、复原能力、机密管理等之间的安全同步和异步通信。不必自己实现这些功能,可以消除样板,降低复杂性,并允许您专注于开发业务功能。在您的时间有限并且您只想进行实验的情况下,在Dapr初始设置上花费大量时间可能会令人沮丧。更

微服务实践k8s&dapr开发部署实验(1)服务调用

前置条件 安装docker与dapr: 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 安装k8s dapr 自托管模式运行 新建一个webapi无权限项目 launchSettings.json中applicationUrl端口改成5001,如下: "applicationUr

Dapr Workflow构建块的.NET Demo

Dapr 1.10版本中带来了最有亮点的特性就是工作流构建块的的发布,虽然是Alpha 阶段,可以让我们尽早在应用系统中规划工作流, 在使用Dapr的系统中更好的编写负责的分布式应用系统。Dapr 工作流使你能够生成跨多个应用的长时间运行的持久进程或数据流。 Dapr 工作流可以与其他 Dapr A

Dapr v1.10.0 版本已发布

Dapr是一套开源、可移植的事件驱动型运行时,允许开发人员轻松立足云端与边缘位置运行弹性、微服务、无状态以及有状态等应用程序类型。Dapr能够确保开发人员专注于编写业务逻辑,而不必分神于解决分布式系统难题,由此显著提高生产力并缩短开发时长。Dapr 是用于构建云原生应用程序的开发人员框架,可以更轻松

Dapr v1.11 版本已发布

Dapr是一套开源、可移植的事件驱动型运行时,允许开发人员轻松立足云端与边缘位置运行弹性、微服务、无状态以及有状态等应用程序类型。Dapr能够确保开发人员专注于编写业务逻辑,而不必分神于解决分布式系统难题,由此显著提高生产力并缩短开发时长。Dapr 是用于构建云原生应用程序的开发人员框架,可以更轻松

采用Dapr 的IoT 案例

CNCF 发布了一篇Dapr 的IoT 案例:Tempestive uses Dapr and K8s to track IoT messages | CNCF。Tempestive 是一家物联网解决方案提供商,其产品 Nuboj 面临着可扩展性、成本和维护方面的挑战。为了解决这些问题,Tempes

Dapr 发布模糊测试报告|Dapr 完成模糊测试审核

Dapr 团队最近在博客上发布了 Dapr 完成模糊测试审核[1]的文章,该审计是 CNCF 通过模糊测试改善[2]开源云原生项目安全状况的计划的一部分。该审计由 Ada Logics[3] 于 2023 年 5 月和 6 月进行的,Ada Logics 团队为了改善 Daprs 安全状况,并且由于

微服务实践k8s&dapr开发部署实验(3)订阅发布

自托管模式运行dapr 新建订阅webapi项目,取名为backend 项目增加docker支持,取消https支持 修改Program.cs var builder = WebApplication.CreateBuilder(args); builder.Services.AddControll

微服务实践k8s&dapr开发部署实验(2)状态管理

新建webapi项目 建项目时取消https支持,勾选docker支持, Program.cs中注释下面语句,这样部署后才能访问Swagger // Configure the HTTP request pipeline. //if (app.Environment.IsDevelopment())

使用 Visual Studio 2022 调试Dapr 应用程序

使用Dapr 编写的是一个多进程的程序, 两个进程之间依赖于启动顺序来组成父子进程,使用Visual Studio 调试起来可能会比较困难,因为 Visual Studio 默认只会把你当前设置的启动项目的启动调试。 好在有Visual Studio 扩展(Microsoft Child Proce