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

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

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

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

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

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

使用 .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 会启动所有服务,并在仪表板中提供分布式系统的完整视图

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

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

带有 .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 仪表板上的资源详细信息中看出:

处理更复杂的 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 结合使用获得无与伦比的本地开发体验的更多相关文章

  1. Dapr + .NET Core实战(十三)跨语言开发

    因为基于Dapr的服务架构是不限语言的,我们来看看Dapr的跨语言开发.我们使用golang,python,.NET来实现跨语言的服务调用,拓扑如下 我们继续使用.NET 5的fontend和back ...

  2. Dapr 已在塔架就位 将发射新一代微服务

    微服务是云原生架构的核心,通常使用Kubernetes 来按需管理服务扩展. 微软一直走在 Cloud Native Computing Foundation的 最前沿,并通过使用Kubernetes ...

  3. Dapr微服务应用开发系列0:概述

    题记:Dapr是什么,Dapr包含什么,为什么要用Dapr. Dapr是什么 Dapr(Distributed Application Runtime),是微软Azure内部创新孵化团队的一个开源项目 ...

  4. Dapr微服务应用开发系列2:Hello World与SDK初接触

    题记:上篇介绍了Dapr的环境配置,这次我们来动手尝试一下Dapr应用的开发 Hello World Dapr应用的Hello World其实和其他的Hello World一样简单: 首先用你喜欢的语 ...

  5. dapr学习:dapr介绍

    该部分主要是给出学习dapr的入门,描述dapr全貌告诉你dapr是啥以及介绍dapr的主要功能与组件 该部分分为两章: 第一章:介绍dapr 第二章:调试dapr的解决方案项目 1. 介绍dapr ...

  6. YARP实现Dapr服务调用的反向代理

    楔子 公司即将新开项目,打算用点时髦的技术,需要探探路.之前没做过微服务项目,没有技术栈方面的积(负)累(债), 干脆就上微软的分布式运行时Dapr......嗯......用来服务发现,然后等测试用 ...

  7. 乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时

    Dapr是一个由微软主导的云原生开源项目,国内云计算巨头阿里云也积极参与其中,2019年10月首次发布,到今年2月正式发布V1.0版本.在不到一年半的时间内,github star数达到了1.2万,超 ...

  8. Blazor+Dapr+K8s微服务之开发环境调试

    1         安装Dapr开发调试环境 1.1         Dapr 完整安装模式不支持开发调试 在上一篇随笔<Blazor+Dapr+K8s微服务之服务调用>中,我们通过为每个 ...

  9. Dapr实战(一) 基础概念与环境搭建

    什么是Dapr Dapr 是一个可移植的.事件驱动的运行时,可运行在云平台或边缘计算中.支持多种编程语言和开发框架. 上面是官方对Dapr的介绍.有点难以理解,大白话可以理解为:Dapr是一个运行时, ...

  10. 手把手教你学Dapr - 4. 服务调用

    上一篇:手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 介绍 通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠.安全地通信. 为什么不直接用Ht ...

随机推荐

  1. 深入理解 SQL UNION 运算符及其应用场景

    SQL UNION运算符 SQL UNION运算符用于组合两个或多个SELECT语句的结果集. 每个UNION中的SELECT语句必须具有相同数量的列. 列的数据类型也必须相似. 每个SELECT语句 ...

  2. C#对接部标JT808协议实现北斗定位设备数据接收服务端

    一.前言介绍 开发一套能够支撑几万台北斗定位设备数据接收的服务端,用于接收北斗定位器定位数据的平台.项目基于windows平台,C#语言开发框架Net Framework4.8,TCP主要基于Supe ...

  3. MyBatis-Plus 代码生成(新)

    MyBatis-Plus 的代码生成功能十分人性化,即支持通过简单的配置实现,也可以通过自定义模板实现. 这里列出项目中的常用配置供参考,其他配置可以参考官网:https://baomidou.com ...

  4. jemter做参数化的几种方法

    第一种:使用用户参数:添加--前置处理器--用户参数

  5. keycloak~对架构提供的provider总结

    提供者目录 Provider Authenticator BaseDirectGrantAuthenticator AbstractFormAuthenticator AbstractUsername ...

  6. 【Python3.10.4】Centos7 ,centos8,centos9源码安装 python3.10.4 解释器

    1.检查是否安装wget如果没有安装则: 终端执行: yum -y install wget 2.下载python3源码包 终端执行: wget https://www.python.org/ftp/ ...

  7. This version of Android Studio cannot open this project, please retry with Android Studio 4.0 or newer.

    前言 遇到的问题,This version of Android Studio cannot open this project, please retry with Android Studio 4 ...

  8. Tkinter常用功能示例(一)

    技术背景 Tkinter是一个Python自带的GUI框架,虽然现在主流的还是用pyqt的多一些,但是Tkinter在环境配置上可以节省很多工作,可以用来做一些小项目.如果是大型项目,用pyqt或者Q ...

  9. (二)asyncio的简单使用,python异步高效处理数据,asyncio.get_event_loop(),loop.run_until_complete(main()),loop.close()

    Asyncio 是一个基于事件循环的异步I/O框架,它提供了高效的协程实现,能够轻松地编写高并发的Python程序.Asyncio 在 Python 3.4 中首次引入,它的核心是事件循环(Event ...

  10. Kafka 线上性能调优

    Kafka 线上性能调优是一项综合工程,不仅仅是 Kafka 本身,还应该从硬件(存储.网络.CPU)以及操作系统方面来整体考量,首先我们要有一套生产部署方案,基于这套方案再进行调优,这样就有了可靠的 ...