Dapr + .NET Core實戰(六)綁定

什麼是綁定

處理外部事件或調用外部接口的功能就是綁定,綁定可以提供以下好處:

  • 避免連接到消息系統 ( 如隊列和消息總線 ) 並進行輪詢的複雜性
  • 聚焦於業務邏輯,而不是如何與系統交互
  • 使代碼不受 SDK 或外部庫的強耦合
  • 處理重試和故障恢復

Dapr提供了很多支持的綁定,請見綁定。綁定分爲輸入綁定輸出綁定,輸入綁定是監聽外部事件,觸發業務邏輯。輸出綁定是調用外部資源。

綁定可能與前面介紹的發佈訂閱類似。 儘管它們很相似,但也有不同之處。 發佈/訂閱側重於 Dapr services 之間的異步通信。 資源綁定具有更大的範圍。 它側重於軟件平臺之間的系統互操作性。 在不同的應用程序、數據存儲和微服務應用程序之外的服務之間交換信息。

工作原理

Dapr 資源綁定需要通過yaml文件定義綁定組件。 此 YAML 文件描述要與其綁定的資源類型。 配置後,你的服務可以接收來自資源的事件或觸發事件。

輸入綁定

輸入綁定通過外部資源的傳入事件觸發代碼。 下圖的示例中需要在app中保留/tweet接口,以供sidecar調用

 

  1. Dapr Sidecar讀取綁定配置文件並訂閱爲外部資源。 
  2. 當外部資源觸發時,在 Dapr sidecar中運行的綁定組件會選取它並觸發一個事件。
  3. Dapr sidecar調用指定的接口。 在此示例中,服務在 /tweet 端口6000上偵聽終結點上的 HTTP POST。 由於它是 HTTP POST 操作,因此在請求正文中傳遞事件的 JSON 有效負載。
  4. 處理事件後,服務將返回 HTTP 狀態代碼 200 OK 。

輸出綁定

 輸出綁定使服務能夠觸發調用外部資源。 跟輸入綁定同樣,需要配置描述輸出綁定的綁定配置 YAML 文件。該事件在應用程序的 Dapr Sidecar上調用bingdings API。

 

 

  1. Dapr sidecar讀取綁定配置文件,其中包含有關如何連接到外部資源的信息。
  2. 應用程序調用sidecar的 /v1.0/bindings/sms Dapr 終結點。 在這種情況下,它使用 HTTP POST 來調用 API。 還可以使用 gRPC。
  3. Dapr sidecar的綁定組件會調用外部消息系統來發送消息。 消息將包含 POST 請求中傳遞的負載。

項目實例

此例子中我們使用rabbitmq作爲外部資源。因爲rabbitmq既支持輸入綁定又支持輸出綁定

 首先,在默認組件目錄C:\Users\<username>\.dapr\components中新建rabbitbinding.yaml

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: RabbitBinding
spec:
  type: bindings.rabbitmq
  version: v1
  metadata:
  - name: queueName
    value: queue1
  - name: host
    value: amqp://admin:[email protected]: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

每個綁定配置都在metadata 中包含常規元素 name 和 namespace 。 Dapr 將根據配置的 name 字段確定要調用的服務的終結點 。 在上面的示例中,Dapr 將在事件發生是調用 /RabbitBinding 事件發生時調用方法。

我們在FrontEnd中定義RabbitBindingController

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

using System.IO;
using System.Text;

namespace FrontEnd.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class RabbitBindingController : ControllerBase
    {
        private readonly ILogger<RabbitBindingController> _logger;
        public RabbitBindingController(ILogger<RabbitBindingController> logger)
        {
            _logger = logger;
        }
        [HttpPost]
        public ActionResult Post()
        {
            Stream stream = Request.Body;
            byte[] buffer = new byte[Request.ContentLength.Value];
            stream.Position = 0L;
            stream.ReadAsync(buffer, 0, buffer.Length);
            string content = Encoding.UTF8.GetString(buffer);
            _logger.LogInformation(".............binding............." + content);
            return Ok();
        }
    }
}

 

現在我們啓動Frontend程序

https://docs.dapr.io/zh-hans/reference/components-reference/supported-bindings/rabbitmq/

然後打開RabbitMQ Management,查看Queue,發現queue1已成功創建

 

 

 我們先來驗證輸入綁定,在RabbitMQ Management中直接發送消息

 

 

 現在去控制檯查看日誌,發現輸入綁定成功觸發

== APP == info: FrontEnd.Controllers.RabbitBindingController[0]
== APP ==       .............binding.............1111111122222

現在我們來驗證輸出綁定,在RabbitBindingController中新建接口

        [HttpGet]
        public async Task<ActionResult> GetAsync([FromServices]DaprClient daprClient)
        {
            await daprClient.InvokeBindingAsync("RabbitBinding", "create", "9999999");
            return Ok();
        }

爲了防止新建的消息被輸入綁定消費,先把Post方式註釋掉

        //[HttpPost]
        //public ActionResult Post()
        //{
        //    Stream stream = Request.Body;
        //    byte[] buffer = new byte[Request.ContentLength.Value];
        //    stream.Position = 0L;
        //    stream.ReadAsync(buffer, 0, buffer.Length);
        //    string content = Encoding.UTF8.GetString(buffer);
        //    _logger.LogInformation(".............binding............." + content);
        //    return Ok();
        //}

現在調用, 查看隊列queue1中的消息,可看到剛纔輸出的消息

http://localhost:3501/v1.0/invoke/frontend/method/RabbitBinding

 

查看結果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章