Dapr 与 .NET Aspire 结合使用获得无与伦比的本地开发体验
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 主机项目,后者充当业务流程协调程序:
- Alice,一个 ASP.NET 核心服务,它使用 Dapr 的服务调用从另一个服务检索天气数据,并使用状态存储对其进行缓存。
- Bob 是一个 ASP.NET Core 服务,它返回虚假的天气数据,然后使用 pub/sub 发布“请求天气预报”事件。
- 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 结合使用获得无与伦比的本地开发体验的更多相关文章
- Dapr + .NET Core实战(十三)跨语言开发
因为基于Dapr的服务架构是不限语言的,我们来看看Dapr的跨语言开发.我们使用golang,python,.NET来实现跨语言的服务调用,拓扑如下 我们继续使用.NET 5的fontend和back ...
- Dapr 已在塔架就位 将发射新一代微服务
微服务是云原生架构的核心,通常使用Kubernetes 来按需管理服务扩展. 微软一直走在 Cloud Native Computing Foundation的 最前沿,并通过使用Kubernetes ...
- Dapr微服务应用开发系列0:概述
题记:Dapr是什么,Dapr包含什么,为什么要用Dapr. Dapr是什么 Dapr(Distributed Application Runtime),是微软Azure内部创新孵化团队的一个开源项目 ...
- Dapr微服务应用开发系列2:Hello World与SDK初接触
题记:上篇介绍了Dapr的环境配置,这次我们来动手尝试一下Dapr应用的开发 Hello World Dapr应用的Hello World其实和其他的Hello World一样简单: 首先用你喜欢的语 ...
- dapr学习:dapr介绍
该部分主要是给出学习dapr的入门,描述dapr全貌告诉你dapr是啥以及介绍dapr的主要功能与组件 该部分分为两章: 第一章:介绍dapr 第二章:调试dapr的解决方案项目 1. 介绍dapr ...
- YARP实现Dapr服务调用的反向代理
楔子 公司即将新开项目,打算用点时髦的技术,需要探探路.之前没做过微服务项目,没有技术栈方面的积(负)累(债), 干脆就上微软的分布式运行时Dapr......嗯......用来服务发现,然后等测试用 ...
- 乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时
Dapr是一个由微软主导的云原生开源项目,国内云计算巨头阿里云也积极参与其中,2019年10月首次发布,到今年2月正式发布V1.0版本.在不到一年半的时间内,github star数达到了1.2万,超 ...
- Blazor+Dapr+K8s微服务之开发环境调试
1 安装Dapr开发调试环境 1.1 Dapr 完整安装模式不支持开发调试 在上一篇随笔<Blazor+Dapr+K8s微服务之服务调用>中,我们通过为每个 ...
- Dapr实战(一) 基础概念与环境搭建
什么是Dapr Dapr 是一个可移植的.事件驱动的运行时,可运行在云平台或边缘计算中.支持多种编程语言和开发框架. 上面是官方对Dapr的介绍.有点难以理解,大白话可以理解为:Dapr是一个运行时, ...
- 手把手教你学Dapr - 4. 服务调用
上一篇:手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 介绍 通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠.安全地通信. 为什么不直接用Ht ...
随机推荐
- 小师妹学JavaIO之:文件读取那些事
目录 简介 字符和字节 按字符读取的方式 按字节读取的方式 寻找出错的行数 总结 简介 小师妹最新对java IO中的reader和stream产生了一点点困惑,不知道到底该用哪一个才对,怎么读取文件 ...
- 【开源三方库】Fuse.js:强大、轻巧、零依赖的模糊搜索库
开源项目 OpenHarmony 是每个人的 OpenHarmony 曹天恒 公司:中国科学院软件研究所 小组:知识体系工作组 1.简介 Fuse.js是一款功能强大且轻量级的JavaScript ...
- SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析
SQL RIGHT JOIN关键字 SQL RIGHT JOIN关键字返回右表(table2)中的所有记录以及左表(table1)中的匹配记录.如果没有匹配,则左侧的结果为0条记录. RIGHT JO ...
- 及刻周边惠:拥抱HarmonyOS原子化服务
原文链接:https://mp.weixin.qq.com/s/Y75eiRlvDLXzoZWzAiZdeg,点击链接查看更多技术内容: 开发背景 及刻周边惠是梦享网络旗下本地生活服务平台,旨在为消费 ...
- IIS 加载32dll失败
前言 遇到一个这样的问题,因为在一个项目中是32位的,至于为什么是32位的呢,因为调用的都是老库,32位的,部署到iis出现错误如下: Server Error in '/' Application. ...
- Vue 3 进阶用法:异步组件
一.代码分割 一个大型前端应用,如果所有代码都放在单一文件,体积会特别大,下载时间长,白屏时间久,用户体验差. 代码分割是一种有效的优化方式.提前把代码切分为多个小块,只下载当前必需的部分,用到哪块下 ...
- springboot+thymeleaf+mybatis实现甘特图(代码非常详细)
首先我们要明白:这个甘特图需要哪些动态数据. (1)需要:ID,tName,number,计划开始时间,开始时间,计划结束时间,结束时间,项目负责人,参与人,知情人ID,计划时长(可以计算得出的,不必 ...
- NOI 2024省选OIFC模拟21 蒲巴巴 超繁做法
题目描述 一年一度的 PuBaBa 杯开始了! 今年的 PuBaBa 杯总共有 \(n\) 个选手来参加,编号分别为 \(1,2,\cdots,n\),他们的水平按编号依次递增,所以他们过的题目数量单 ...
- 【pytorch学习】之概率
6 概率 简单地说,机器学习就是做出预测.根据病人的临床病史,我们可能想预测他们在下一年心脏病发作的概率.在飞机喷气发动机的异常检测中,我们想要评估一组发动机读数为正常运行情况的概率有多大.在强化学习 ...
- Kubernetes API 编程利器:Operator 和 Operator Framework
本文整理自<CNCF x Alibaba 云原生技术公开课>第 24 讲,点击"阅读原文"直达课程页面. 关注"阿里巴巴云原生"公众号,回复关键词& ...