使用Masa DaprStarter搭建开发环境

使用Masa DaprStarter搭建开发环境

安装Dapr

Windows安装Dapr的方式有很多,可以参考官方文档

https://docs.dapr.io/getting-started/install-dapr-cli/

国内如果访问缓慢,建议直接下载msi文件安装

https://github.com/dapr/cli/releases

在这里插入图片描述
安装一路下一步即可。

安装Docker Desktop

直接参考官方文档,这里不过多赘述

https://docs.docker.com/desktop/install/windows-install/

初始化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项目PubDemoSubDemo,并分别安装Dapr.ClientMasa.Contrib.Development.DaprStarter.AspNetCore后者方便我们在开发环境管理dapr的生命周期。
我们在SubDemo项目中额外安装Dapr.AspNetCore
PubDemoProgram.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还可以看到链路信息
在这里插入图片描述在这里插入图片描述

还可以查看依赖关系,非常方便。
在这里插入图片描述
全文结束。

posted @ 2023-04-18 21:50  sunday866  阅读(104)  评论(0)    收藏  举报