Dapr-绑定构建块

前言:

 前篇-发布订阅文章对Dapr的订阅/发布进行了解,本篇继续对 绑定 构建块进行了解。

一、简介:

 Dapr 资源绑定使服务能够跨即时应用程序外部的外部资源集成业务操作。 来自外部系统的事件可能会触发服务中的操作,从而传递上下文信息。 然后,你的服务可以通过触发另一个外部系统中的事件来扩展操作,并传递上下文有效负载信息。 服务无需耦合或感知外部资源即可进行通信。 管道封装在预定义的 Dapr 组件中。 运行时可以轻松交换使用的 Dapr 组件,而无需更改代码。

 使用绑定,可以使用来自外部系统的事件或与外部系统的接口来触发应用程序。 此构建块提供了以下好处:

  • 除去连接到消息传递系统 ( 如队列和消息总线 ) 并进行轮询的复杂性
  • 聚焦于业务逻辑,而不是如何与系统交互的实现细节
  • 使代码不受 SDK 或库的跟踪
  • 处理重试和故障恢复
  • 在运行时在绑定之间切换
  • 构建具有特定于环境的绑定的可移植应用程序,不需要进行代码更改

二、工作原理

 Dapr 资源绑定以组件配置文件开头。 此 YAML 文件描述要绑定到的资源类型及其配置设置。 配置后,服务可以从资源接收事件,也可以触发其上的事件。

 下图是Dapr 资源绑定的概念体系结构:假设有一个 Twitter 帐户,每当用户推文关键字时都会触发事件。 服务公开接收并处理推文的事件处理程序。 完成后,服务将触发调用外部 Twilio 服务的事件。 Twilio 发送包含推文的短信

  

 初看之下,资源绑定行为可能类似于发布/订阅模式。 尽管它们有相似之处,但存在差异。

 发布/订阅:侧重于 Dapr 服务之间的异步通信。 资源绑定的范围要宽得多。

 绑定:侧重于跨软件平台的系统互操作性。 在微服务应用程序外部的不同应用程序、数据存储和服务之间交换信息。

三、功能

  • 输入绑定

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

   为了接收来自输入绑定的事件 :

    • 定义描述绑定类型及其元数据 ( 连接信息等) 的组件 YAML
    • 监听传入事件的 HTTP 终结点,或使用 gRPC 原型库获取传入事件

   

   步骤如下:

  1. Dapr sidecar 读取绑定配置文件并订阅为外部资源指定的事件。 在示例中,事件源是 Twitter 帐户。
  2. 在 Twitter 上发布匹配的推文时,在 Dapr sidecar 中运行的绑定组件会选取它并触发事件。
  3. Dapr sidecar 调用终结点 (即为绑定) 事件处理程序。 在示例中,服务侦听端口6000 上的终结点(/tweet)上的 HTTP POST。 由于它是 HTTP POST 操作,因此事件的 JSON 有效负载在请求正文中传递。
  4. 处理事件后,服务将返回 HTTP 状态代码 200 OK 

  如果操作应出错,将返回相应的 400 或 500 级别 HTTP 状态代码。 对于具有至少 一次 传递保证的绑定,Dapr sidecar 将重试触发器。 

  • 输出绑定

   输出绑定允许用户调用外部资源。 可选的有效负载和元数据可与调用请求一起发送。

   为了调用输出绑定:

    • 定义描述绑定类型及其元数据 ( 连接信息等) 的组件 YAML
    • 使用 HTTP 终结点或 gRPC 方法调用具有可选有效负载的绑定

    

   步骤如下:

  1. Dapr sidecar 读取绑定配置文件,并提供有关如何连接到外部资源的信息。 在示例中,外部资源是 Twilio SMS 帐户。
  2. 应用程序调用 /v1.0/bindings/sms Dapr sidecar 上的终结点。 在这种情况下,它使用 HTTP POST 调用 API。 也可使用 gRPC。
  3. Dapr sidecar 中运行的绑定组件调用外部消息传送系统来发送消息。 该消息将包含 POST 请求中传递的有效负载。
  • 绑定组件

   绑定组件支持情况:

Name输入
绑定
输出
绑定
状态组件版本自从
Apple Push Notifications (APN)   ✅ Alpha v1 1.0
Cron (scheduler) ✅ ✅ Alpha v1 1.0
HTTP   ✅ GA v1 1.0
InfluxDB   ✅ Alpha v1 1.0
Kafka ✅ ✅ Alpha v1 1.0
Kubernetes 事件 ✅   Alpha v1 1.0
本地存储   ✅ Alpha v1 1.1
MQTT ✅ ✅ Alpha v1 1.0
MySQL   ✅ Alpha v1 1.0
PostgrSQL   ✅ Alpha v1 1.0
Postmark   ✅ Alpha v1 1.0
RabbitMQ ✅ ✅ Alpha v1 1.0
Redis   ✅ Alpha v1 1.0
SMTP   ✅ Alpha v1 1.0
Twilio   ✅ Alpha v1 1.0
Twitter ✅ ✅ Alpha v1 1.0
SendGrid   ✅ Alpha v1 1.0

四、.NET Core 应用

 1、创建绑定:添加绑定组件名:myevent

  创建以下 YAML 文件,名为 binding.yaml,并将其保存到应用程序的 components 子文件夹中。 (使用具有 --components-path 标记 的 dapr run 命令来指向自定义组件目录)

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: myevent
  namespace: default
spec:
  type: bindings.kafka
  version: v1
  metadata:
  - name: topics
    value: topic1
  - name: brokers
    value: localhost:9092
  - name: consumerGroup
    value: group1

 2、.NET CORE绑定调用:

  Dapr .NET SDK 为 .NET Core 开发人员提供特定于语言的支持。使用 DaprClient.InvokeBindingAsync() 方法简化了调用已配置的输出绑定:

private async Task SendSMSAsync([FromServices] DaprClient daprClient)
{
    var message = "Welcome to this awesome service";
    var metadata = new Dictionary<string, string>
    {
      { "toNumber", "555-3277" }
    };
   //执行绑定操作:sms的create操作
await daprClient.InvokeBindingAsync("myevent", "create", message, metadata); }

 3、调用Dapr绑定:

curl -X POST -H 'Content-Type: application/json' http://localhost:3500/v1.0/bindings/myevent -d '{ "data": { "message": "Hi!" }, "operation": "create" }'

五、总结:

 Dapr 资源绑定使你可以与不同的外部资源和系统集成,而无需依赖于其库或 Sdk。 这些外部系统不一定必须是消息传递系统,例如服务总线或消息代理。 数据存储和 web 资源(如 Twitter 或 SendGrid)还存在绑定。

 输入绑定 (或触发器) 对外部系统中发生的事件做出响应。 它们调用在你的应用程序中预先配置的公共 HTTP 终结点。 Dapr 使用配置中的绑定名称来确定要在应用程序中调用的终结点。

 输出绑定将消息发送到外部系统。 通过在 /v1.0/bindings/<binding-name> Dapr sidecar 上的终结点上执行 HTTP POST 来触发输出绑定。 还可以使用 gRPC 来调用绑定。 .NET SDK 提供 InvokeBindingAsync 使用 gRPC 调用 Dapr 绑定的方法。

 使用 Dapr 组件实现绑定。 这些组件由社区提供。 每个绑定组件的配置都有特定于它所抽象的外部系统的元数据。 此外,它支持的命令和负载的结构将因绑定组件而异。

posted @ 2021-11-14 19:19  chaney1992  阅读(584)  评论(0)    收藏  举报