前言:
前篇-發布訂閱文章對Dapr的訂閱/發布進行了解,本篇繼續對 綁定 構建塊進行了解。
一、簡介:
Dapr 資源綁定使服務能夠跨即時應用程序外部的外部資源集成業務操作。 來自外部系統的事件可能會觸發服務中的操作,從而傳遞上下文信息。 然后,你的服務可以通過觸發另一個外部系統中的事件來擴展操作,並傳遞上下文有效負載信息。 服務無需耦合或感知外部資源即可進行通信。 管道封裝在預定義的 Dapr 組件中。 運行時可以輕松交換使用的 Dapr 組件,而無需更改代碼。
使用綁定,可以使用來自外部系統的事件或與外部系統的接口來觸發應用程序。 此構建塊提供了以下好處:
- 除去連接到消息傳遞系統 ( 如隊列和消息總線 ) 並進行輪詢的復雜性
- 聚焦於業務邏輯,而不是如何與系統交互的實現細節
- 使代碼不受 SDK 或庫的跟蹤
- 處理重試和故障恢復
- 在運行時在綁定之間切換
- 構建具有特定於環境的綁定的可移植應用程序,不需要進行代碼更改
二、工作原理
Dapr 資源綁定以組件配置文件開頭。 此 YAML 文件描述要綁定到的資源類型及其配置設置。 配置后,服務可以從資源接收事件,也可以觸發其上的事件。
下圖是Dapr 資源綁定的概念體系結構:假設有一個 Twitter 帳戶,每當用戶推文關鍵字時都會觸發事件。 服務公開接收並處理推文的事件處理程序。 完成后,服務將觸發調用外部 Twilio 服務的事件。 Twilio 發送包含推文的短信
初看之下,資源綁定行為可能類似於發布/訂閱模式。 盡管它們有相似之處,但存在差異。
發布/訂閱:側重於 Dapr 服務之間的異步通信。 資源綁定的范圍要寬得多。
綁定:側重於跨軟件平台的系統互操作性。 在微服務應用程序外部的不同應用程序、數據存儲和服務之間交換信息。
三、功能
-
輸入綁定
輸入綁定用於在發生來自外部資源的事件時觸發應用程序。 可選的有效負載和元數據可以與請求一起發送。
為了接收來自輸入綁定的事件 :
-
- 定義描述綁定類型及其元數據 ( 連接信息等) 的組件 YAML
- 監聽傳入事件的 HTTP 終結點,或使用 gRPC 原型庫獲取傳入事件
步驟如下:
- Dapr sidecar 讀取綁定配置文件並訂閱為外部資源指定的事件。 在示例中,事件源是 Twitter 帳戶。
- 在 Twitter 上發布匹配的推文時,在 Dapr sidecar 中運行的綁定組件會選取它並觸發事件。
- Dapr sidecar 調用終結點 (即為綁定) 事件處理程序。 在示例中,服務偵聽端口6000 上的終結點(
/tweet
)上的 HTTP POST。 由於它是 HTTP POST 操作,因此事件的 JSON 有效負載在請求正文中傳遞。 - 處理事件后,服務將返回 HTTP 狀態代碼
200 OK
如果操作應出錯,將返回相應的 400 或 500 級別 HTTP 狀態代碼。 對於具有至少 一次 傳遞保證的綁定,Dapr sidecar 將重試觸發器。
-
輸出綁定
輸出綁定允許用戶調用外部資源。 可選的有效負載和元數據可與調用請求一起發送。
為了調用輸出綁定:
-
- 定義描述綁定類型及其元數據 ( 連接信息等) 的組件 YAML
- 使用 HTTP 終結點或 gRPC 方法調用具有可選有效負載的綁定
步驟如下:
- Dapr sidecar 讀取綁定配置文件,並提供有關如何連接到外部資源的信息。 在示例中,外部資源是 Twilio SMS 帳戶。
- 應用程序調用
/v1.0/bindings/sms
Dapr sidecar 上的終結點。 在這種情況下,它使用 HTTP POST 調用 API。 也可使用 gRPC。 - 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 | |
✅ | ✅ | 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 組件實現綁定。 這些組件由社區提供。 每個綁定組件的配置都有特定於它所抽象的外部系統的元數據。 此外,它支持的命令和負載的結構將因綁定組件而異。