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

什么是发布-订阅

发布订阅是一种众所周知并被广泛使用的消息传送模式,常用在微服务架构的服务间通信,高并发削峰等情况。但是不同的消息中间件之间存在细微的差异,项目使用不同的产品需要实现不同的实现类,虽然是明智的决策,但必须编写和维护抽象及其基础实现。此方法需要复杂、重复且容易出错的自定义代码。

Dapr为了解决这种问题,提供开箱即用的消息传送抽象和实现,封装在 Dapr 构建基块中。业务系统只需调用跟据Dapr的要求实现订阅发布即可。

工作原理

11d4c53903546ae954e8412bef4b9d53.png

Dapr 发布&订阅构建基块提供了一个与平台无关的 API 框架来发送和接收消息。

服务将消息发布到指定主题, 业务服务订阅主题以使用消息。

服务在 Dapr sidecar 上调用 pub/sub API。然后,sidecar 调用预定义 Dapr pub/sub 组件。

任何编程平台都可以使用 Dapr 本机 API 通过 HTTP 或 gRPC 调用构建基块。若要发布消息,请进行以下 API 调用:

http://localhost:<dapr-port>/v1.0/publish/<pub-sub-name>/<topic>

上述调用中有几个特定于 Dapr 的 URL 段:

  • <dapr-port> 提供 Dapr sidecar 侦听的端口号。

  • <pub-sub-name> 提供所选 Dapr pub/sub 组件的名称。

  • <topic> 提供消息发布到的主题的名称。

设置发布订阅组件

Dapr 为 Pub/Sub 提供很多支持的组件,例如 Redis 和 Kafka 等。支持组件详见 链接

在win10上的自承载的Dapr中,默认在 %UserProfile%\.dapr\components\pubsub.yaml 中使用redis作为了pub/sub组件,dapr run一个app时,使用默认组件作为pub/sub组件

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: pubsub
spec:type: pubsub.redisversion: v1metadata:- name: redisHostvalue: localhost:6379- name: redisPasswordvalue: ""

订阅主题

Dapr 允许两种方法订阅主题:

  • 声明式,其中定义在外部文件中。

  • 编程方式,订阅在用户代码中定义

1.声明式订阅

在默认组件目录 %UserProfile%\.dapr\components\pubsub.yaml 中新建subscription.yaml文件,并写入以下内容

apiVersion: dapr.io/v1alpha1
kind: Subscription
metadata:name: myevent-subscription
spec:topic: test_topicroute: /TestPubSubpubsubname: pubsub
scopes:
- frontend

上面的示例显示了 test_topic主题的事件订阅,使用组件 pubsub

  • route 告诉 Dapr 将所有主题消息发送到应用程序中的 /TestPubSub 端点。

  • scopes 为 FrontEnd启用订阅

现在需要在FrontEnd项目中定义接口TestSub,在FrontEnd中新建TestPubSubController

using Dapr.Client;using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;using System.IO;
using System.Text;
using System.Threading.Tasks;namespace FrontEnd.Controllers
{[Route("[controller]")][ApiController]public class TestPubSubController : ControllerBase{private readonly ILogger<TestPubSubController> _logger;private readonly DaprClient _daprClient;public TestPubSubController(ILogger<TestPubSubController> logger, DaprClient daprClient){_logger = logger;_daprClient = daprClient;}[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);return Ok(content);}[HttpGet("pub")]public async Task<ActionResult> PubAsync(){var data = new WeatherForecast();await _daprClient.PublishEventAsync<WeatherForecast>("pubsub", "test_topic", data);return Ok();}}
}

需要在Startup的Configure中开启重复读取Body才能读取到数据

app.Use((context, next) =>{context.Request.EnableBuffering();return next();});

启动FrontEnd

dapr run --dapr-http-port 3501 --app-port 5001  --app-id frontend dotnet  .\FrontEnd\bin\Debug\net5.0\FrontEnd.dll

调用 pub API发布消息

1690c6a349439e03b059183c277b9189.png

查看订阅情况,订阅消息消费成功

b8de9609fa01191a610a440e00a9cc84.png

 2.编程式订阅

为了防止声明式订阅的影响,需要先把目录<%UserProfile%\.dapr\components\pubsub.yaml>中subscription.yaml文件删除

TestPubSubController新增Api Sub

[Topic("pubsub", "test_topic")][HttpPost("sub")]public async Task<ActionResult> Sub(){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("testsub" + content);return Ok(content);}

在Startup的Configure方法中新增中间件

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{// ...app.UseCloudEvents();app.UseEndpoints(endpoints =>{endpoints.MapSubscribeHandler();// ...});
}

启动FrontEnd

dapr run --dapr-http-port 3501 --app-port 5001  --app-id frontend dotnet  .\FrontEnd\bin\Debug\net5.0\FrontEnd.dll

调用API发布消息

b2a928b00f151c7ef8de26e7ab036386.png

 查看订阅情况,订阅消息消费成功

fc6a5e5d5454de3558c313f2c43108a2.png

 通过DapreCLI同样可以发布消息

dapr publish --publish-app-id frontend --pubsub pubsub --topic test_topic --data '{"date":"0001-01-01T00:00:00","temperatureC":0,"temperatureF":32,"summary":null}'

查看订阅情况,订阅消息消费成功

36b765d8bf5b645beb897061a051b28f.png

相关文章:

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

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

相关文章

词性分法程序

http://tieba.baidu.com/p/1180650771?pid13814874186&cid0#13814874186 给你个函数看看,分析下有什么用 句列表指针 存储的是一句话的数据,其中已经分好词,并知道每个词的词性.周春海(专有名词) 是(动词) 周依言(专有名词) 的(的词) 爸爸(抽象名词) .(句号词)程序里的词性…

计算机信息处理教案,冀教版七年级信息技术第二课计算机--信息处理工具 教案...

ID:10796280分类&#xff1a;江苏,2019资源大小&#xff1a;22KB资料简介:《第二课 计算机——信息处理工具》教学设计教 者&#xff1a;课时1教学内容&#xff1a;第二课 计算机——信息处理工具教学目标&#xff1a;1知识目标&#xff1a;学生应了解计算机的工作原理&#xf…

这些数学趣图,数学老师看了后会怎么想?

全世界有3.14 % 的人已经关注了爆炸吧知识这个扣分不?我的人生98%的时间都是无比正确的数学与我不能言语的关系最深情的告白限速是......当我完成数学作业后....维生素C的来历高数课堂恩..... 来拜师了啊, 好好学习. 为师给你命名: 阿尔法狗.这个是驻点, 这是最值, 这些机器学…

COM 组件设计与应用(六)

一、前言  1、与 《COM 组件设计与应用(五)》的内容基本一致。但本回讲解的是在 vc.net 2003 下的使用方法&#xff0c;即使你不再使用vc6.0&#xff0c;也请和上一回的内容&#xff0c;参照比对。   2、这第一个组件&#xff0c;除了所有 COM 组件必须的 IUnknown 接口外&…

为什么不可以使用哈曼顿距离_请对比下欧式距离和曼哈顿距离的差别

●今日面试题分享●在k-means或kNN&#xff0c;我们常用欧氏距离来计算最近的邻居之间的距离&#xff0c;有时也用曼哈顿距离&#xff0c;请对比下这两种距离的差别解析&#xff1a;欧氏距离&#xff0c;最常见的两点之间或多点之间的距离表示法&#xff0c;又称之为欧几里得度…

dmidecode常用的查询

1、查看内存槽数、那个槽位插了内存&#xff0c;大小是多少dmidecode|grep -P -A5 "Memory\sDevice"|grep Size|grep -vRange2、查看最大支持内存数dmidecode|grep -P \Maximum\sCapacity\3、查看槽位上内存的速率&#xff0c;没插就是unknown。dmidecode|grep -A16 …

python 柱状图 间距_专题第18篇:Python 绘图入门

我的施工之路1我的施工计划2数字专题3字符串专题4列表专题5流程控制专题6编程风格专题7函数使用8面向对象编程(上篇)9面向对象编程(下篇)10十大数据结构11包和模块使用总结12Python正则专题总结13设计模式14Python时间模块总结15 Python 装饰器16 Python 迭代器17 Python 生成器…

WPF实现截屏(仿微信)

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 前言有小伙伴需要在软件反馈窗体增加截图功能需求&#xff0c;所以今天来实现一个仿微信的截图。01—效果预览效果预览&#xff08;更多效果请下…

我妈要把闺蜜介绍给我当女朋友......

1 反正手没闲着啊▼2 这...这女孩子不会是您跳广场舞认识的吧&#xff1f;▼3 这就是生活▼4 有画面感了▼5 这种运动会想想就觉得很好看▼6 电脑屏幕不亮手机玩起来不够舒服▼7 这种脱衣方式可真是太酷啦&#xff01;▼你点的每个赞&#xff0c;我都认真当成了喜欢

用回溯法找出n个自然数中取r个数的全排列

回溯法也称为试探法&#xff0c;该方法首先暂时放弃关于问题规模大小的限制&#xff0c;并将问题的候选解按某种顺序逐一枚举和检验。在回溯法中&#xff0c;放弃当前候选解&#xff0c;寻找下一个候选解的过程称为回溯。本实例是用回溯法输出n个自然数中以r个数全排列。代码如…

topic数量是指什么_一个网站的IP、UV和PV到底是什么

在百度统计后台会看到“IP统计”、“UV统计”、“PV统计”&#xff0c;那么、什么是IP&#xff0c;什么是UV&#xff0c;什么又是PV&#xff0c;三者之间有什么关系&#xff0c;IP重要&#xff0c;还是UV重要&#xff0c;还是PV重要。什么是IP&#xff1f;IP即&#xff1a;Inte…

发布一个博客园专用Windows Live Writer代码插件

一直用Windows Live Writer写博客&#xff0c;不过没找到能与博客园配合得很好的代码插件&#xff0c;每次写完文章发布到博客园总要手动修改代码。所以我自己写了一个博客园专用的Windows Live Writer代码插件&#xff08;我知道这世界上已经有N个代码插件&#xff0c;好吧&am…

计算机辅助教育会议,子会议1:学习科学、计算机辅助合作学习、智慧教育

子会议1&#xff1a;学习科学、计算机辅助合作学习、智慧教育一、目的学习科学(learning sciences)是在反思认知科学等学科、关于学习方法的研究方法和观点的基础上兴起的&#xff0c;从90年代逐渐发展后&#xff0c;迅即跃升为国际间研究"学习"的热门学科。它的宗旨…

js深拷贝和浅拷贝

一、数组的深浅拷贝 在使用JavaScript对数组进行操作的时候&#xff0c;我们经常需要将数组进行备份&#xff0c;事实证明如果只是简单的将它赋予其他变量&#xff0c;那么我们只要更改其中的任何一个&#xff0c;然后其他的也会跟着改变&#xff0c;这就导致了问题的发生。 va…

dbeaver 数据转化 mapping_Python机器学习实例:数据竞赛-足球运动员身价估计

前言1&#xff0c;背景介绍每个足球运动员在转会市场都有各自的价码。本次数据练习的目的是根据球员的各项信息和能力来预测该球员的市场价值。2&#xff0c;数据来源FIFA20183&#xff0c;数据文件说明数据文件分为三个&#xff1a;train.csv         训练集     文件…

对SQL server、Oracle、MySQL和PostgreSQL进行OLTP性能测试(Benchmark)

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#xff0c;首发于 【掘金】&#x1f4e2;作者格言&#xff1a;生活在于…

【完整版】当大师遇到了理工男,只能吐血了...

全世界有3.14 % 的人已经关注了爆炸吧知识1、青年问禅师&#xff1a;“大师&#xff0c;我很爱我的女朋友&#xff0c;她也有很多优点&#xff0c;但是总有几个缺点让我非常讨厌&#xff0c;有什么方法能让她改变&#xff1f;”禅师浅笑&#xff0c;答&#xff1a;“方法很简单…

[FW]软件开发中的11个系统思维定律

“我会更加努力地工作”——一匹名叫Boxer的马&#xff08;出自乔治奥威尔的《动物农庄》&#xff09; 彼得圣吉在其著作《第五项修炼》中提到的系统思维定律同样适用于软件开发。 1. 今日的问题源于昨日的解决方案&#xff08;Today’s problems come from yesterday’s sol…

5单个编译总会编译全部_VS2019 v16.5 MSVC编译器后端更新汇总

MSVC更新汇总在Visual Studio 2019 v16.5中&#xff0c;我们已经对C后端进行了持续的改进更新&#xff0c;包括新增了一些新特性和优化点&#xff0c;编译时间优化&#xff0c;以及更好的安全性。下面我们来汇总一下目前关于MSVC编译器后端更新的要点&#xff1a;> Intel JC…

LinkedIn已将可自定义的索引引擎IndexTank开源

LinkedIn已将IndexTank开源&#xff0c;这是一种运行在云中的文档索引引擎&#xff0c;它让用户可以自定义编制索引的过程&#xff0c;并对结果进行微调。 IndexTank是在一年之前发布的&#xff0c;在十月份被LinkedIn收购&#xff0c;并在最近开放了源代码。IndexTank是与Goog…