Dapr + .NET 实战(六)绑定
什么是綁定
處理外部事件或調用外部接口的功能就是綁定,綁定可以提供以下好處:
避免連接到消息系統 ( 如隊列和消息總線 ) 并進行輪詢的復雜性
聚焦于業務邏輯,而不是如何與系統交互
使代碼不受 SDK 或外部庫的強耦合
處理重試和故障恢復
Dapr提供了很多支持的綁定,請見綁定。綁定分為輸入綁定與輸出綁定,輸入綁定是監聽外部事件,觸發業務邏輯。輸出綁定是調用外部資源。
綁定可能與前面介紹的發布訂閱類似。盡管它們很相似,但也有不同之處。發布/訂閱側重于 Dapr services 之間的異步通信。資源綁定具有更大的范圍。它側重于軟件平臺之間的系統互操作性。在不同的應用程序、數據存儲和微服務應用程序之外的服務之間交換信息。
工作原理
Dapr 資源綁定需要通過yaml文件定義綁定組件。此 YAML 文件描述要與其綁定的資源類型。配置后,你的服務可以接收來自資源的事件或觸發事件。
輸入綁定
輸入綁定通過外部資源的傳入事件觸發代碼。下圖的示例中需要在app中保留/tweet接口,以供sidecar調用
Dapr Sidecar讀取綁定配置文件并訂閱為外部資源。?
當外部資源觸發時,在 Dapr sidecar中運行的綁定組件會選取它并觸發一個事件。
Dapr sidecar調用指定的接口。在此示例中,服務在?/tweet?端口6000上偵聽終結點上的 HTTP POST。由于它是 HTTP POST 操作,因此在請求正文中傳遞事件的 JSON 有效負載。
處理事件后,服務將返回 HTTP 狀態代碼?200 OK?。
輸出綁定
?輸出綁定使服務能夠觸發調用外部資源。跟輸入綁定同樣,需要配置描述輸出綁定的綁定配置 YAML 文件。該事件在應用程序的 Dapr Sidecar上調用bingdings API。
Dapr sidecar讀取綁定配置文件,其中包含有關如何連接到外部資源的信息。
應用程序調用sidecar的?/v1.0/bindings/sms?Dapr 終結點。在這種情況下,它使用 HTTP POST 來調用 API。還可以使用 gRPC。
Dapr sidecar的綁定組件會調用外部消息系統來發送消息。消息將包含 POST 請求中傳遞的負載。
項目實例
此例子中我們使用rabbitmq作為外部資源。因為rabbitmq既支持輸入綁定又支持輸出綁定。
?首先,在默認組件目錄C:\Users\<username>\.dapr\components中新建rabbitbinding.yaml
apiVersion: dapr.io/v1alpha1 kind: Component metadata:name: RabbitBinding spec:type: bindings.rabbitmqversion: v1metadata:- name: queueNamevalue: queue1- name: hostvalue: amqp://admin:123456@192.168.43.101:5672- name: durablevalue: true- name: deleteWhenUnusedvalue: false- name: ttlInSecondsvalue: 60- name: prefetchCountvalue: 0- name: exclusivevalue: false- name: maxPriorityvalue: 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查看結果
相關文章:Dapr實戰(一) 基礎概念與環境搭建
Dapr + .NET Core實戰(二) 服務調用
Dapr + .NET Core實戰(三)狀態管理
Dapr + .NET 實戰(四)發布和訂閱
Dapr + .NET 實戰(五)Actor
總結
以上是生活随笔為你收集整理的Dapr + .NET 实战(六)绑定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BeetleX进程服务管理组件应用
- 下一篇: Dapr牵手.NET学习笔记:状态管理进