Dapr + .NET 实战(六)绑定

什么是绑定

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

  • 避免连接到消息系统 ( 如队列和消息总线 ) 并进行轮询的复杂性

  • 聚焦于业务逻辑,而不是如何与系统交互

  • 使代码不受 SDK 或外部库的强耦合

  • 处理重试和故障恢复

Dapr提供了很多支持的绑定,请见绑定。绑定分为输入绑定输出绑定,输入绑定是监听外部事件,触发业务逻辑。输出绑定是调用外部资源。

绑定可能与前面介绍的发布订阅类似。尽管它们很相似,但也有不同之处。发布/订阅侧重于 Dapr services 之间的异步通信。资源绑定具有更大的范围。它侧重于软件平台之间的系统互操作性。在不同的应用程序、数据存储和微服务应用程序之外的服务之间交换信息。

工作原理

Dapr 资源绑定需要通过yaml文件定义绑定组件。此 YAML 文件描述要与其绑定的资源类型。配置后,你的服务可以接收来自资源的事件或触发事件。

输入绑定

输入绑定通过外部资源的传入事件触发代码。下图的示例中需要在app中保留/tweet接口,以供sidecar调用

45526eb07df5cadbb92c38507a16aca0.png

  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。

5ff168fbf7843c0531f1d3bae0db5aea.png

  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.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已成功创建

6dc767037744e3a36dd145244c26b78c.png

 我们先来验证输入绑定,在RabbitMQ Management中直接发送消息

4eef2f3249d409eb3e9c6000dfa14b58.png

 现在去控制台查看日志,发现输入绑定成功触发

== 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

48bcdccd7736c4907c9dfb7b731ee0bf.png

查看结果

ddcb289dae163298574a00336e381d26.png

相关文章:
  • Dapr实战(一) 基础概念与环境搭建

  • Dapr + .NET Core实战(二) 服务调用

  • Dapr + .NET Core实战(三)状态管理

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

  • Dapr + .NET 实战(五)Actor

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对象中multipartfile 空报错_Python 为什么会有个奇怪的“...”对象?

我想到一种特别的写法&#xff0c;很多人会把它当成 pass 语句的替代。在文章发布后&#xff0c;果然有三条留言提及了它。所谓特别的写法就是下面这个&#xff1a;# 用 ... 替代 passdef foo():...它是中文标点符号的半个省略号&#xff0c;也即由英文的 3 个点组成。如果你是…

XP硬盘安装Fedora14图文教程

XP硬盘安装Fedora14图文教程发表于&#xff1a;2010年11月03日 分类&#xff1a;Fedora 26 条评论 5,044 次阅读 昨天是Fedora 14的发布&#xff0c;这篇文章介绍的是如何在windows XP下硬盘安装Fedora 14。 之前写过2篇文章&#xff1a; Linux下硬盘安装Fedora 13&#xff1a;…

用wamper打开php源码_php源码该怎么设置数据库

php源码该怎么设置数据库php源码修改数据库的设置方法&#xff1a;首先在源码中找到程序的配置文件&#xff1b;然后用文本编辑器打开&#xff1b;之后修改数据库地址、数据库名、用户名、连接密码、数据库前缀等参数&#xff1b;最后保存即可。这里以织梦程序为例&#xff0c;…

豆瓣评分9.0+,这几部纪录片看一部少一部!

纪录片是以真实生活为创作素材&#xff0c;以真人真事为表现对象&#xff0c;并对其进行艺术的加工与展现的&#xff0c;以展现真实为本质&#xff0c;并用真实引发人们思考的电影或电视艺术形式。好的纪录片就像打开了一扇新世界的大门&#xff0c;让我们了解更多世界的奇妙之…

记一次 .NET 某纺织工厂 MES系统 API 挂死分析

一&#xff1a;背景 1. 讲故事这个月中旬&#xff0c;有位朋友加我wx求助他的程序线程占有率很高&#xff0c;寻求如何解决&#xff0c;截图如下&#xff1a;说实话&#xff0c;和不同行业的程序员聊天还是蛮有意思的&#xff0c;广交朋友&#xff0c;也能扩大自己的圈子&#…

python求斜边上的高_直角三角形斜边上的高怎么求

展开全部 直角三角形斜边32313133353236313431303231363533e78988e69d8331333431336666上的高的求法&#xff1a; 1. 直角三角形斜边上的高等于两条直角边的乘积除以斜边的商。 例如&#xff1a;直角三角形的两个直角边分别为a和b&#xff0c;斜边为c&#xff0c;那么&#xff…

使用identity+jwt保护你的webapi(一)——identity基础配置

前言用户模块几乎是每个系统必备的基础功能&#xff0c;如果每次开发一个新项目时都要做个用户模块&#xff0c;确实非常无聊。好在asp.net core给我们提供了Identity&#xff0c;使用起来也是比较方便&#xff0c;如果对用户这块需求不是非常个性化的话&#xff0c;identity是…

年轻人不能“饥渴”太久,否则……

全世界只有3.14 % 的人关注了爆炸吧知识文 / 较高端人类来源 / 较高端人类&#xff08;ID&#xff1a;xinji656&#xff09;转发到朋友圈健康生活从饮水做起本文来源于微信公众号&#xff1a;较高端人类&#xff08;ID&#xff1a;xinji656&#xff09;我们只研究那些你感兴趣的…

Redis集群(一):集群搭建

2019独角兽企业重金招聘Python工程师标准>>> 概述 这里只记录操作步骤和集群测试&#xff0c;保证快速搭建集群环境。具体原理请查阅官方文档&#xff08;中文版&#xff09;&#xff1a; http://www.redis.cn/topics/cluster-spec.html 集群容灾&#xff1a;Redis集…

python优惠券机器人_python实现机器人卡牌

介绍 这个例子主要利用turtle库实现根据输入动态展示不同机器人的图像和属性信息。 代码部分非原创只是做了些许修改和整理使得更易阅读。 图片和文件资源请访问git仓库获取&#xff1a;链接地址 涉及以下知识点&#xff1a; 1.文件读取 2.字典 3.turtle库的使用 4.控制语句 实…

使用identity+jwt保护你的webapi(二)——获取jwt token

前言上一篇已经介绍了identity在web api中的基本配置&#xff0c;本篇来完成用户的注册&#xff0c;登录&#xff0c;获取jwt token。开始开始之前先配置一下jwt相关服务。配置JWT 首先NuGet安装包&#xff1a;<PackageReference Include"Microsoft.AspNetCore.Authent…

假如,绿茶婊的目标变成女生......

1 假如绿茶的目标是女生▼2 也不知道我爹今晚回去要迎接怎样的狂风暴雨▼3 这撞衫撞得有点尴尬▼4 我是一个小胖子没事玩玩小肚子▼5 看起来也不傻可能就是单纯的有猫病▼6 在严肃场合努力憋笑的我▼7 妈妈&#xff1a;叫你吃饭不吃饭&#xff01;三请四请才肯来&#x…

docker 启动mysql root用户_Docker-Compose搭建Wordpress博客系统

环境&#xff1a;CentOS 7.5Docker 20.10.2Docker-Compose 1.25.5[rootlocalhost ~]# cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core)[rootlocalhost ~]# docker version # Docker版本Client: Docker Engine - Community Version: 20.10.2…

跪着看完这14个机械动图

全世界只有3.14 % 的人关注了爆炸吧知识神奇的机械原理动态GIF图&#xff0c;很有意思&#xff0c;或许你能学到点什么&#xff01;↑↑时间书写机器↑↑↑↑鸡尾酒制作机↑↑↑↑移树机↑↑↑↑扔球机&#xff08;用于陪狗玩&#xff09;↑↑↑↑甜甜圈抓取机↑↑↑↑玻璃瓶加…

sql 百分数_SQL经典50题笔记

SQL语句执行顺序(8) SELECT (9)DISTINCT<Select_list> (1) FROM <left_table> (3) <join_type>JOIN<right_table> (2) ON<join_condition> (4) WHERE<where_condition> (5) GROUP BY<group_by_list> (6) WITH {CUBE|ROLLUP} (7) HAV…

这种秀恩爱你见过吗?

1 棒棒哒&#xff0c;做的好2 程序员的日常3 一群单身鱼都看呆了4 最佳COS5 自拍达喵6 为什么你们能长这么大&#xff1f;懵逼了7 请用一个词形容这张图你点的每个赞&#xff0c;我都认真当成了喜欢

Layui宣布下线,不自禁的感叹一下,回忆啊

简单唠唠 其实对于前端的信息好久没关注了&#xff0c;一堆后端的Bug要撸&#xff0c;实在没有时间&#xff1b;由于浏览器收藏的东西比较多&#xff0c;于是就想抽点时间归归类&#xff0c;方便查询信息&#xff1b;趁这个机会就挨个点进去瞅一遍&#xff08;随便摸摸鱼&#…

《C语言及程序设计》程序填空——字符数组与字符串处理

返回&#xff1a;贺老师课程教学链接 1、编写一函数&#xff0c;由实参传来一个字符串&#xff0c;统计此字符串中字母、数字、空格和其它字符的个数&#xff0c;在主函数中输入字符串以及输出上述的结果。请将下面的程序补充完整。#include<stdio.h> #include<string…

csv文件设置每个cell大小_Python对文本文件和Excel的处理机制

有头发且有趣的码农万里挑一~ 96有料叔 | 一位有故事的程序猿读取文件内容的方式直接一次性读取文件内容按行读取文件内容将读取的文件内容形成一个列表直接一次性读取文件内容open()需要手动释放资源&#xff0c;最后使用close()with open() as…使用with … as…&#xff0c;…

idea2020.2.2怎么创建web项目_创建Vue3.0的项目

1. 查看Vue的环境版本Vue -V如果版本低于4.0&#xff0c;则需要升级Vue的版本npm install -g vue/cli2. 创建Vue 3.0的项目3. VS Code 的环境配置安装Extension&#xff1a;ESLint&#xff0c; Vetur。VS Code基于ESLint的Auto Save功能&#xff0c;可以很好的格式化代码&#…