什么是绑定

处理外部事件或调用外部接口的功能就是绑定,绑定可以提供以下好处:

  • 避免连接到消息系统 ( 如队列和消息总线 ) 并进行轮询的复杂性
  • 聚焦于业务逻辑,而不是如何与系统交互
  • 使代码不受 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:123456@192.168.43.101: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

查看结果

Dapr + .NET Core实战(六)绑定的更多相关文章

  1. Dapr + .NET Core实战(七)Secrets

    什么是Secrets 应用程序通常会通过使用专用的存储来存储敏感信息,如连接字符串.密钥等. 通常这需要建立一个密钥存储,如Azure Key Vault.Hashicorp等,并在那里存储应用程序级 ...

  2. Dapr + .NET Core实战(十一)单机Dapr集群

    如何单机部署Dapr集群 第十篇讲过了K8S集群下如何使用Dapr运行程序,但是很多人一直在问如何单机下进行Dapr的负载,这节课我们来聊聊如何单机进行Dapr的负载. 首先要说的是单机下,通过 da ...

  3. Dapr + .NET Core实战(十一)单机Dapr集群负载均衡

    如何单机部署Dapr集群 第十篇讲过了K8S集群下如何使用Dapr运行程序,但是很多人一直在问如何单机下进行Dapr的负载,这节课我们来聊聊如何单机进行Dapr的负载. 首先要说的是单机下,通过 da ...

  4. Dapr + .NET Core实战(十四)虚拟机集群部署 mDNS + Consul

    前面我们说了在单机模式下和K8S集群下的Dapr实战,这次我们来看看如何在不使用K8S的情况下,在一个传统的虚拟机集群里来部署Dapr. 1.环境准备 我们准备两台centos7虚拟机 Dapr1:1 ...

  5. Dapr + .NET Core实战(九)本地调试

    前几节开发Dapr应用程序时,我们使用 dapr cli 来启动dapr服务,就像这样: dapr run --dapr-http-port 3501 --app-port 5001 --app-id ...

  6. Dapr + .NET Core实战(十二)服务调用之GRPC

    什么是GRPC gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. gRPC 的主要优点是: 高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的 ...

  7. Dapr + .NET Core实战(十三)跨语言开发

    因为基于Dapr的服务架构是不限语言的,我们来看看Dapr的跨语言开发.我们使用golang,python,.NET来实现跨语言的服务调用,拓扑如下 我们继续使用.NET 5的fontend和back ...

  8. Dapr + .NET Core实战(四)发布和订阅

    什么是发布-订阅 发布订阅是一种众所周知并被广泛使用的消息传送模式,常用在微服务架构的服务间通信,高并发削峰等情况.但是不同的消息中间件之间存在细微的差异,项目使用不同的产品需要实现不同的实现类,虽然 ...

  9. Dapr + .NET Core实战(五)Actor

    什么是Actor模式 Actors 为最低级别的"计算单元" 以上解释来自官方文档,看起来"晦涩难懂".大白话就是说Actors模式是一段需要单线程执行的代码块 ...

随机推荐

  1. 在C#中使用C++编写的类——用托管C++进行封装

    现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额.因此很多以前搞VC++开发的人都转向用更强大的VS.Net.在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类 ...

  2. 【面试题】挑战10个最难回答的Java面试题(附答案)

    转自:https://mp.weixin.qq.com/s/Kd-2qkDfaokHU7d2nfsE6w 1.为什么等待和通知是在 Object 类而不是 Thread 中声明的? 一个棘手的 Jav ...

  3. .net core api 对于FromBody的参数验证

    前言 在framework的mvc中,经常会使用 Model.State . ModelState.IsValid 配合着特性进行参数验证,通过这种方式可以降低controller的复杂度,使用方便. ...

  4. 【linux】vim常用命令

    转自:https://www.runoob.com/linux/linux-vim.html vi/vim 的使用 基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输 ...

  5. hystrix熔断机制修改配置

    0.注意 0.1.如果使用command 的 execute( )方法的话,其实在一个for循环,执行多次,其实每个的执行顺序并不是固定的,如果你想固定,需要使用queue circuit break ...

  6. springboot:嵌套使用异步注解@Async还会异步执行吗

    一.引言 在前边的文章<[springboot:使用异步注解@Async的那些坑>中介绍了使用@Async注解获取任务执行结果的错误用法,今天来分享下另外一种常见的错误. 二.代码演示 下 ...

  7. 基于SigalR实现的奥运会实时金牌榜

    系统架构 三端 winform 后台数据管理 + Asp.Net Mvc 前台数据展示 + Xamarin.Forms 移动端跨平台APP 因为本人的代码水平一般,期间遇到了一些问题,如signalR ...

  8. Ajax技术---核心XMLHttpRequest对象

    Ajax 的全称是Asynchronous JavaScript and XML,其中,Asynchronous 是异步的意思,它有别于传统web开发中采用的同步的方式. (一)ajax技术的意义 我 ...

  9. 搭建私服仓库:(一)Windows安装Nuxus

    Nexus下载 官网.官网下载.百度云盘 提取码:su33 将nexus下载下来,以2.14.5的windows版本为例子(3.x暂时下载不下来,迅雷会员都不行) 下载后进行解压,得到以下目录: 其中 ...

  10. 20201219 u,v,w

    开考前刚起床,所以一边考一边吃饭,然后整场都很迷... A. u 考场 半天才搞懂"下三角区域"指哪个区域,手模样例确认后打了 \(O(qn^2)\) 的裸暴力,然后就不会做了. ...