Dapr + .NET 实战绑定
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.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 实战绑定的主要内容,如果未能解决你的问题,请参考以下文章