使用Masa DaprStarter搭建开发环境
使用Masa DaprStarter搭建开发环境
安装Dapr
Windows安装Dapr的方式有很多,可以参考官方文档
国内如果访问缓慢,建议直接下载msi文件安装
安装一路下一步即可。
安装Docker Desktop
直接参考官方文档,这里不过多赘述
初始化Dapr
命令行执行
dapr init
这里如果有类似网络错误,那就需要考虑魔法上网或者直接到dapr的github 上下载 dashboard_darwin_amd64.zip和
daprd_windows_amd64.zip 两压缩包,
执行dapr init 有了bin目录后 看准时机 把下载好的两个压缩包复制进去
例如:C:\Users\Administrator\.dapr 下的bin目录中,该目录下的压缩包会自动解压
如果失败可以通过 dapr uninstall 命令卸载后重试。
安装成功后通过 dapr -v 可以看到如下版本信息
在Docker Desktop中会创建三个容器
代码开发
我们新建两个WebApi项目,模拟微服务之间通过dapr调用的场景。
新建webapi项目PubDemo和SubDemo,并分别安装Dapr.Client和Masa.Contrib.Development.DaprStarter.AspNetCore后者方便我们在开发环境管理dapr的生命周期。
我们在SubDemo项目中额外安装Dapr.AspNetCore。
在PubDemo的Program.cs添加
if (builder.Environment.IsDevelopment()) { builder.Services.AddDaprStarter(builder.Configuration.GetSection("DaprOptions"), false); }
并在配置文件中添加DaprOptions配置
"DaprOptions": { "AppId": "pub-demo-webapi", "AppPort": 18009, "AppIdSuffix": "", "DaprGrpcPort": 20333, "DaprHttpPort": 20334, "LogLevel": "debug" }
同样在SubDemo添加上述内容,注意端口号不要重复。
"DaprOptions": { "AppId": "sub-demo-webapi", "AppPort": 19009, "AppIdSuffix": "", "DaprGrpcPort": 20233, "DaprHttpPort": 20234, "LogLevel": "debug" }
这里需要注意在SubDemo项目中AppPort需要与launchSettings.json中应用的启动端口保持一致,这里都是19009,这个AppPort不是dapr的端口 而是需要与dapr sidecar通信的应用程序的端口地址。
"SubDemo": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", "applicationUrl": "http://localhost:19009", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }
在SubDemo中还需要订阅相关的配置,完整代码如下
var builder = WebApplication.CreateBuilder(args); //注册 Dapr //将 AddDapr 扩展方法附加到 AddControllers 扩展方法会注册必要的服务以将 Dapr 集成到 MVC 管道中 builder.Services.AddControllers().AddDapr(); if (builder.Environment.IsDevelopment()) { builder.Services.AddDaprStarter(builder.Configuration.GetSection("DaprOptions"), false); } builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); // 将 CloudEvents 中间件添加到 ASP.NET Core 中间件管道中 app.UseCloudEvents(); app.MapControllers(); // 终结点路由配置中对 MapSubscribeHandler 的调用会将 Dapr 订阅终结点添加到应用程序。 app.MapSubscribeHandler(); app.Run();
注意这里,app.MapSubscribeHandler();
此终结点将响应 /dapr/subscribe 上的请求。 调用此终结点时,它将自动查找使用 Topic 属性修饰的所有 WebAPI 操作方法,并指示 Dapr 为这些方法创建订阅。
我们在SubDemo新建一个WebApi接口来订阅Pub数据
namespace SubDemo.Controllers { [Route("api/[controller]")] [ApiController] public class SubTestController : ControllerBase { [Topic("pubsub", "testdata")] [HttpPost("testdata")] public void TestData([FromBody] string testStrData) { Console.WriteLine("Subscriber received : " + testStrData); } } }
这里Topic第一个参数为pubsub 组件名称,第二个参数为订阅的主题名称。默认的pubsub组件配置在C:\Users\Administrator.dapr\components目录下。
apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: pubsub spec: type: pubsub.redis version: v1 metadata: - name: redisHost value: localhost:6379 - name: redisPassword value: ""
SubDemo编写完毕,接下来再PubDemo中添加一个测试Api
using Dapr.Client; using Microsoft.AspNetCore.Mvc; namespace PubDemo.Controllers { [Route("api/[controller]")] [ApiController] public class PubTestController : ControllerBase { private readonly Dapr.Client.DaprClient daprClient; public PubTestController() { daprClient = new DaprClientBuilder().Build(); } [HttpPost] public async Task PostTestDataAsync([FromBody] string testStrData) { await daprClient.PublishEventAsync("pubsub", "testdata", testStrData); } } }
这里直接通过PublishEventAsync方法向testdata写入一条文本信息。
测试效果
我们同时启动SubDemo和PubDemo两个项目。
应用完全启动后,在命令行通过dapr list可以看到DaprStarter已经帮我们启动好了两个dapr实例。
在SubDemo的日志中,我们可以看到Dapr启动和订阅成功的日志
我们调用PubDemo中的测试Api,可以在SubDemo的日志看到消费成功的日志
也可以在redis中看到对应的记录
我们打开zipkin还可以看到链路信息
还可以查看依赖关系,非常方便。
全文结束。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期