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 |
| 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 組件實現綁定。這些組件由社區提供。每個綁定組件的配置都有特定於它所抽象的外部系統的元數據。此外,它支持的命令和負載的結構將因綁定組件而異。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/u81a0aU55Tiw4IRt1dG2Ww