• Dapr + .NET Core实战(六)绑定


    4小时Dapr+.NET 5+K8S 的实战  https://ke.qq.com/course/4000292?tuin=1271860f

    Dapr进阶虚拟机集群实战(非K8S) https://ke.qq.com/course/4002149?tuin=1271860f

                       

    什么是绑定

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

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

    查看结果

  • 相关阅读:
    filter in the new axis?
    项目 ".wdproj "所需的应用程序未安装。确保已安装项目类型(.wdproj)的应用程序
    firefox的webmail notifier网易邮箱设置
    phpmyadmin导出数据中文乱码问题解决
    Eclipse快捷键大全(转载)
    Android Error: Unable to open class file R.java
    将 SQL Server Express 版用于 ASP.NET (Visual Studio)
    MySql常用命令
    Godaddy Google Adwords 促销代码使用
    HTTP 错误 500.22 Internal Server Error—IIS7 Asp.net2.0 网站运行失败解决办法
  • 原文地址:https://www.cnblogs.com/chenyishi/p/15343564.html
Copyright © 2020-2023  润新知