手把手教你學Dapr - 8. 繫結

MASA技術團隊發表於2022-01-19

目錄

手把手教你學Dapr - 1. .Net開發者的大時代

手把手教你學Dapr - 2. 必須知道的概念

手把手教你學Dapr - 3. 使用Dapr執行第一個.Net程式

手把手教你學Dapr - 4. 服務呼叫

手把手教你學Dapr - 5. 狀態管理

手把手教你學Dapr - 6. 釋出訂閱

手把手教你學Dapr - 7. Actors

手把手教你學Dapr - 8. 繫結

介紹

使用繫結,您可以使用來自外部系統的事件觸發您的應用程式,或與外部系統互動。這個構建塊為您和您的程式碼提供了幾個好處:

  • 消除連線和輪詢訊息系統(如佇列和訊息匯流排)的複雜性
  • 關注業務邏輯,而不是如何與系統互動的實現細節
  • 讓您的程式碼不受 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包引用和Assignment.Shared專案引用,最後修改程式埠為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包引用和Assignment.Shared專案引用。

修改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

本章原始碼

Assignment08

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

我們正在行動,新的框架、新的生態

我們的目標是自由的易用的可塑性強的功能豐富的健壯的

所以我們借鑑Building blocks的設計理念,正在做一個新的框架MASA Framework,它有哪些特點呢?

  • 原生支援Dapr,且允許將Dapr替換成傳統通訊方式
  • 架構不限,單體應用、SOA、微服務都支援
  • 支援.Net原生框架,降低學習負擔,除特定領域必須引入的概念,堅持不造新輪子
  • 豐富的生態支援,除了框架以外還有元件庫、許可權中心、配置中心、故障排查中心、報警中心等一系列產品
  • 核心程式碼庫的單元測試覆蓋率90%+
  • 開源、免費、社群驅動
  • 還有什麼?我們在等你,一起來討論

經過幾個月的生產專案實踐,已完成POC,目前正在把之前的積累重構到新的開源專案中

目前原始碼已開始同步到Github(文件站點在規劃中,會慢慢完善起來):

MASA.BuildingBlocks

MASA.Contrib

MASA.Utils

MASA.EShop

BlazorComponent

MASA.Blazor

QQ群:7424099

微信群:加技術運營微信(MasaStackTechOps),備註來意,邀請進群

masa_stack_tech_ops.png

相關文章