Dapr 绑定

使用绑定,您可以使用来自外部系统的事件触发您的应用程序,或与外部系统交互。这个构建块为您和您的代码提供了几个好处:

  • 消除连接和轮询消息系统(如队列和消息总线)的复杂性
  • 关注业务逻辑,而不是如何与系统交互的实现细节
  • 让您的代码不受 SDK 或库的影响
  • 处理重试和故障恢复
  • 运行时在绑定之间切换
  • 构建可移植的应用程序,其中设置了特定于环境的绑定,不需要更改代码

输入绑定

输入绑定用于在发生来自外部资源的事件时触发您的应用程序。可选的payload和元数据可以与请求一起发送。

为了从输入绑定接收事件:

  1. 定义描述绑定类型及其元数据(连接信息等)的组件 YAML
  2. 侦听传入事件的 HTTP 端点,或使用 gRPC proto 库获取传入事件

输出绑定

输出绑定允许您调用外部资源。可选的payload和元数据可以与请求一起发送。

为了调用输出绑定:

  1. 定义描述绑定类型及其元数据(连接信息等)的组件 YAML
  2. 使用 HTTP 或 gRPC 方法调用具有可选payload的绑定

使用场景

使用绑定,你的代码可以被来自不同资源的传入事件触发,这些资源可以是任何东西:队列、消息传递管道、云服务、文件系统等。

这对于事件驱动处理、数据管道或只是对事件做出一般反应并进行进一步处理是理想的。

Dapr 绑定允许您:

  • 在不包含特定 SDK 或库的情况下接收事件
  • 在不更改代码的情况下替换绑定
  • 专注于业务逻辑而不是事件资源实现

目前Dapr还不支持跨Dapr互调用,而yaron给出的解决方案之一就是绑定

目前绑定支持40中组件,包括Aliyun、Azure、AWS等多家云服务厂商的产品,也包括常见的如Cron, kafka, MQTT, SMTP, Redis以及各种MQ等。

以下图片是.Net Dapr官方教程里的一个示例

input-binding-flow.png

配置组件

本篇文章将用rabbitmq来演示(为什么不用redis,因为redis翻车了,只支持output,没注意看supported),如前几篇文章所说,先配置yaml

  1. 安装rabbitmq
    docker pull rabbitmq:3.8.25-management
    
  2. 运行rabbitmq
    docker run -d --hostname rabbitMQ --name my-rabbitMQ -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.8.25-management
    
  3. Windows打开目录%USERPROFILE%\.dapr\components,创建binding.yaml,内容如下
    apiVersion: dapr.io/v1alpha1
    kind: Component
    metadata:
      name: myevent
      namespace: default
    spec:
      type: bindings.rabbitmq
      version: v1
      metadata:
      - name: queueName
        value: queue1
      - name: host
        value: amqp://admin:admin@localhost:5672
      - name: durable
        value: true
      - name: deleteWhenUnused
        value: false
      - name: ttlInSeconds
        value: 60
      - name: prefetchCount
        value: 0
      - name: exclusive
        value: false
      - name: maxPriority
        value: 5
    
  4. 打开浏览器,输入url:http://localhost:15672/,账号密码为admin,查看rabbitmq已经正常运行

    1.png

.Net调用Dapr的绑定

创建Assignment.Server

创建类库项目,并添加Dapr.Actors.AspNetCoreNuGet包引用,最后修改程序端口为5000。

修改program.cs

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapPost("/myevent", ([Microsoft.AspNetCore.Mvc.FromBody] string word) => Console.WriteLine($"Hello {word}!"));

app.Run();

注:一定要用POST Method,参数记得在Body里面。默认Url与bindings的name对应。能改路由吗?当然能,看下面配置

spec:
  type: binding.rabbitmq
  metadata:
  - name: route
    value: /onevent

运行Assignment.Server

使用Dapr CLI来启动,先使用命令行工具跳转到目录 dapr-study-room\Assignment07\Assignment.Server,然后执行下面命令

dapr run --app-id testbinding --app-port 5000 --dapr-http-port 3500 --dapr-grpc-port 50001 dotnet run

验证服务端绑定配置是否成功

打开浏览器,输入url:http://localhost:15672/#/queues,账号密码为admin,查看是否已经创建一个名为queue1的队列,如下图所示:

2.png

创建Assignment.Client

创建控制台项目,并添加Dapr.ActorsNuGet包引用。

修改Program.cs

using Dapr.Client;

var client = new DaprClientBuilder().Build();
await client.InvokeBindingAsync("myevent", "create", "World");

Console.WriteLine("Binding sent.");

运行Assignment.Client

使用Dapr CLI来启动,先使用命令行工具跳转到目录 dapr-study-room\Assignment07\Assignment.Client,然后执行下面命令

dotnet run

本章源码

https://github.com/doddgu/dapr-study-room

下一章:Dapr 可观测性

通过Tracing(跟踪)、Metrics(指标)、Logs(日志)和Health(运行状况)监控应用程序。分布式跟踪Dapr 使用 Zipkin 协议进行分布式跟踪 和 Metrics 收集。由于 Zipkin 协议的 ...