Dapr牵手.NET学习笔记:发布-订阅

queue,是很好的削峰填谷工具,在业内也是主流;发布订阅,可以有效的解耦两个应用,所以dapr把他们进行了有效的封装,我们使用起来更简单高效。

本篇的案例是下完订单后,会把消息发布到redis(当然也可以是其他)中,通知系统和支付系统会订单这个消息,同时,通知系统和支付系统的两个实例中,只会有一个实例接收到这个消息,进行处理,调用示意图如下:

526e95f3205a33f6fd38eb3006c910c0.png

项目结构如下:

f804dbd2bdb8f10d72dd347a6f49747a.png

一、配置

用docker-compose部署,docker-compose.yml内容

version: '3.4'services:#┌────────────────────────────────┐#│ ordersystem app + Dapr sidecar │#└────────────────────────────────┘ordersystem:image: ${DOCKER_REGISTRY-}ordersystemdepends_on:- redis- placementbuild:context: ../dockerfile: OrderSystem/Dockerfileports:- "3500:3500"volumes:   - ../OrderSystem:/OrderSystem  networks:- b2c-daprordersystem-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "order", "-app-port", "80","-placement-host-address", "placement:50006","-components-path","/components"]depends_on:- ordersystemnetwork_mode: "service:ordersystem"volumes:   - ../components:/components  #┌───────────────────────────────────┐#│ paymentsystem1 app + Dapr sidecar │#└───────────────────────────────────┘  paymentsystem1:image: ${DOCKER_REGISTRY-}paymentsystembuild:context: ../dockerfile: PaymentSystem/Dockerfileports:- "3601:3500"volumes:   - ../PaymentSystem:/PaymentSystem      networks:- b2c-dapr      paymentsystem1-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "pay", "-app-port", "80","-placement-host-address", "placement:50006","-components-path","/components" ]depends_on:- paymentsystem1network_mode: "service:paymentsystem1"volumes:   - ../components:/components #┌───────────────────────────────────┐#│ paymentsystem2 app + Dapr sidecar │#└───────────────────────────────────┘   paymentsystem2:image: ${DOCKER_REGISTRY-}paymentsystembuild:context: ../dockerfile: PaymentSystem/Dockerfilevolumes:   - ../PaymentSystem:/PaymentSystem            ports:- "3602:3500"networks:- b2c-dapr      paymentsystem2-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "pay", "-app-port", "80" ,"-placement-host-address", "placement:50006","-components-path","/components"]depends_on:- paymentsystem2network_mode: "service:paymentsystem2"volumes:   - ../components:/components       #┌───────────────────────────────────┐#│ noticesystem1 app + Dapr sidecar │#└───────────────────────────────────┘  noticesystem1:image: ${DOCKER_REGISTRY-}noticesystembuild:context: ../dockerfile: NoticeSystem/Dockerfileports:- "3701:3500"volumes:   - ../NoticeSystem:/NoticeSystem      networks:- b2c-dapr      noticesystem1-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "notice", "-app-port", "80","-placement-host-address", "placement:50006","-components-path","/components" ]depends_on:- noticesystem1network_mode: "service:noticesystem1"volumes:   - ../components:/components #┌───────────────────────────────────┐#│ noticesystem2 app + Dapr sidecar │#└───────────────────────────────────┘  noticesystem2:image: ${DOCKER_REGISTRY-}noticesystembuild:context: ../dockerfile: NoticeSystem/Dockerfileports:- "3702:3500"volumes:   - ../NoticeSystem:/NoticeSystem      networks:- b2c-dapr      noticesystem2-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "notice", "-app-port", "80","-placement-host-address", "placement:50006","-components-path","/components" ]depends_on:- noticesystem2network_mode: "service:noticesystem2"volumes:   - ../components:/components #┌────────────────────────┐#│ Dapr placement service │#└────────────────────────┘  placement:image: "daprio/dapr"command: ["./placement", "-port", "50006"]ports:- "50006:50006"networks:- b2c-dapr#┌───────────────────┐#│ Redis state store │#└───────────────────┘  redis:image: "redis:latest"ports:- "6380:6379"networks:- b2c-dapr
networks:b2c-dapr:

pubsub.yaml(在components文件夹下 )内容是默认,如下

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

订阅配置文件如下subscription.yaml(在components文件夹下 )

apiVersion: dapr.io/v1alpha1
kind: Subscription
metadata:name: myevent-subscription
spec:topic: orderCompleteroute: /ordercompletepubsubname: pubsub
scopes:
- pay
- notice

二、代码

OrderSystem项目的appsettings.json

"PublishUrl": "http://localhost:3500/v1.0/publish/pubsub/orderComplete"

OrderSystem项目的发布方法

[HttpGet("/orderpub/{orderno}")]public async Task<IActionResult> OrderPub(string orderno){try{_logger.LogInformation($"Order,publish");await Task.Delay(400);var client = _clientFactory.CreateClient();var stringContent = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(new { OrderNo = orderno, Amount = 30000, OrderTime = DateTime.UtcNow}), System.Text.Encoding.UTF8, "application/json");_logger.LogInformation(stringContent.ToString());var content = await client.PostAsync(_publishUrl, stringContent);return new JsonResult(new { order_result = "Order success,and publish", pay_result = content });}catch (Exception exc){_logger.LogCritical(exc, exc.Message);return new JsonResult(new { order_result = "Order success,and publish,pay exception", message = exc.Message });}}

PaymentSystem和NoticeSystem项目中的订阅实现

两个实体类

public class PubBody
{public string id { get; set; }public string source { get; set; }public string pubsubname { get; set; }public string traceid { get; set; }public PubOrder data { get; set; }public string specversion { get; set; }public string datacontenttype { get; set; }public string type { get; set; }public string topic { get; set; }
}public class PubOrder
{public string OrderNo { get; set; }public decimal Amount { get; set; }public DateTime OrderTime { get; set; }
}

NoticeSystem和PaymentSystem两个项目中的订阅方法如下

[HttpPost("/ordercomplete")]public async Task<IActionResult> OrderComplete(){try{_logger.LogInformation("PaymentSystem OrderComplete runing……");using var reader = new StreamReader(Request.Body, System.Text.Encoding.UTF8);var content = await reader.ReadToEndAsync();var pubBody = Newtonsoft.Json.JsonConvert.DeserializeObject<PubBody>(content);_logger.LogInformation($"---------  HostName:{Dns.GetHostName()},OrderNo:{pubBody?.data.OrderNo},OrderAmount:{pubBody?.data.Amount},OrderTime:{pubBody?.data.OrderTime} -----------");await Task.Delay(200);_logger.LogInformation($"subscription pay complete");_logger.LogInformation($"return  SUCCESS");return new JsonResult(new{Status = "SUCCESS"});}catch (Exception exc){_logger.LogCritical(exc, exc.Message);_logger.LogInformation($"return  RETRY");return new JsonResult(new{Status = "RETRY"});}}

三、发布测试

进入在B2C目发,用命令行启动docker compose

docker-compose up -d

可以测试了,调用OrderSystem的对外地址,下订单NO0001,和NO0002

localhost:3500/v1.0/invoke/order/method/orderpub/NO0001和

localhost:3500/v1.0/invoke/order/method/orderpub/NO0001

查看容器noticesystem1

c86ead04c5b31af7a23e1e289b085c4e.png

查看容器noticesystem2

98ee83b632d3aabc7ee651e60540b6d7.png

查看容器paymentsystem1

a321cb68cd473f6347855a9828bc877e.png

查看容器paymentsystem2

9739f68ab59a426ab4f09eb02fa14ea8.png

NoticeSystem和PaymentSystem同时订阅OrderSystem项目的发布orderComplete,两个实例会轮询处理订阅结果。Dapr就这样,把复杂的发布订阅,封装成一个api一样的简单调用和接收,项目中没有一点的痕迹。

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

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

相关文章

Java标签移动_如何使用基于鼠标单击的标签移动特定游戏对象?

我有一个由6个孩子的游戏对象组成的3D模型&#xff0c;我希望能够点击模型的每个部分并使该部分沿某个方向移动然后再次点击它然后返回到它原来的位置 . 我给每个零件都带了一个标签和一个盒子对撞机我打算让它们在我用碰撞器和不同的标签点击物体时移动 . 我看到光线投射有帮助…

sql年月日24小时制_Power Query 抓取气象台24小时降水量数据

我们借鉴之前抓取台风路径数据的例子&#xff0c;试一试抓取降水量数据&#xff1a;之前我们访问过这个网站&#xff0c;也试着抓取过数据&#xff0c;不过在谷歌浏览器中我们只能够找到两天的数据&#xff0c;但是通过台风路径数据抓取&#xff0c;我们猜想只要我们向服务器提…

薅羊毛丨5个平价好物,终于终于终于打折了!

▲ 点击查看大家好&#xff0c;超模全新的固定栏目「薅羊毛」上线了&#xff01;既然是薅羊毛&#xff0c;怎么能空着手来&#xff1f;别看今天是草单&#xff0c;但所有产品都是咱们商务部小哥谈了好久才拿下的团购&#xff0c;而且全都包邮。毕竟好用的好吃的&#xff0c;啥都…

50个Web设计师超便利的工具

作为一个 Web 设计师并不容易&#xff0c;不仅考虑设计与架构&#xff0c;还要时刻注意各种小细节&#xff0c;设计师的工作被各种各样的问题包围&#xff0c;你需要一套超级便利的工具帮你解决各种消耗时间和精力的问题。我爱互联网在这里给您介绍了50个非常强大的工具&#x…

linux之拷贝文件/备份文件;按照原来的权限和日期拷贝.

linux下备份成了问题.虽然有人说 tar gz 之类的,貌似也有类似ghost的软件.ghost对linux的支持没那么好,以前备份linux分区ext4,数据全部没有成功备份. 现在我要将vmware虚拟机中一个硬盘的数据转移到另一个vmware硬盘中,因为他占用了5GB的磁盘空间,却只有2GB文件.比如lfs的时候…

[转载] 三十不立,四十迷惑的人生

冯唐说&#xff1a;世界上有两种长大的方式&#xff0c;一种是明白了&#xff0c;一种是忘记了明白不了的&#xff0c;心中了无牵挂&#xff0c;几乎所有人都是后一种方式长大。而我是不是第三种&#xff1f;没明白&#xff0c;也没忘记明白不了的&#xff0c;所以一直迷茫中&a…

Docker小白到实战之Docker Compose在手,一键足矣

前言Docker可以将应用程序及环境很方便的以容器的形式启动&#xff0c;但当应用程序依赖的服务比较多&#xff0c;或是遇到一个大系统拆分的服务很多时&#xff0c;如果还一个一个的根据镜像启动容器&#xff0c;那就有点累人了&#xff0c;到这有很多小伙伴会说&#xff1a;弄…

Hsiaoyang:Google搜索结果页面分析

Hsiaoyang:Google搜索结果页面分析首先请参看Google官方的“搜索结果页”用户在使用搜索引擎的时候&#xff0c;首先会在搜索框中输入关键词&#xff0c;随后SE会返回一个搜索结果呈现给用户。SEO的主要对象是搜索引擎&#xff0c;而了解搜索引擎对搜索结果的展现对于SEO人员的…

什么是python扩展库_什么是目前比较常用的Python扩展库管理工具

展开全部在Python环境中已经有很多成熟的包&#xff0c;可以通过安装这些包来扩展我们的程序。例如&#xff0c;很32313133353236313431303231363533e4b893e5b19e31333365643464多时候Python开发人员都会去PyPI网站去查找自己想要使用的包&#xff0c;然后进行安装。PyPI ( Pyt…

泰国小哥又双叒叕整活,奇怪的美少女出现了......

最近“文艺复兴”又流行起来了&#xff0c;这一次遭殃的是80和90后的童年偶像——水兵月。在推特“重绘水兵月”的标签下&#xff0c;民间的绘画高手甚至业内的大佬&#xff0c;都以自己的画风&#xff0c;对下面这张出自《美少女战士》的截图进行重绘。下面让我们来欣赏网络上…

USING HAVING

USING 用于表连接时给定连接条件&#xff08;可以理解为简写形式&#xff09;&#xff0c;如 SELECT * FROM table1JOIN table2 ON table1.id table2.id 使用 USING 可以写为 SELECT * FROM table1JOIN table2 USING(id) HAVING 引入 HAVING 是因为 WHERE 无法和统计函数一起使…

ASP.NET Core 中如何通过 AuthorizeAttribute 做自定义验证?

咨询区 jltrem&#xff1a;我想在 ASP.NET Core 中用 authorization 特性实现一个自定义验证&#xff0c;在之前的版本中&#xff0c;我可以用系统提供的 bool AuthorizeCore(HttpContextBase httpContext) 方法&#xff0c;但在这个版本中已经没有该方法了。请问当前我该如何实…

python从random生成列表_详解Python利用random生成一个列表内的随机数

详解Python利用random生成一个列表内的随机数首先,需要导入random模块:import random随机取1-33之间的1个随机数&#xff0c;可能重复:random.choice(range(1,34))print得到一系列随机数,执行一次得到一个随机数:print(random.choice(range(1,34)))随机取1-33之间的6个随机数&a…

DataSet与Xml之间的转换

DataSet转化为Xml&#xff0c;Xml转化为DataSet&#xff0c;Ado.net中使用方法DataSet.WriteXml()和DataSet.ReadXml()&#xff0c;由于有多个重载方法&#xff0c;所以这里有多条路径可以实现&#xff0c;可谓条条大道通罗马。这里我就把所有的用法来尝试下&#xff0c;希望给…

和套套一样,一次性橡胶手套制作现场, 这鬼畜的画风

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;普象工业设计小站ID&#xff1a;iamdesign如果说套套的制作过程很羞羞那同为乳胶制品的乳胶手套制作过程则可以用魔性甚至惊悚来说走进乳胶手套制作的工厂里迎面而来的是数不清的白色之手不停地在转啊转、甩啊甩这画面不…

Installing OpenCV 2.3.1 in Ubuntu

step1&#xff1a;下载 从http://sourceforge.net/projects/opencvlibrary 下载OpenCV源码&#xff0c;下载文件为OpenCV-2.3.1a.tar.bz2。 cd ~ wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.1/OpenCV-2.3.1a.tar.bz2/download step2&#xff1a;…

Magicodes.IE 2.5.6.1发布

2.5.6.12021.10.06修复 #337&#xff0c;bool?类型导出的映射问题2.5.6.02021.10.05合并Magicodes.EPPlus到Magicodes.IE&#xff0c;修复所有单元测试并修复部分Bug对EPPlus进行了部分性能优化&#xff08;比如使用高性能内存流代替MemoryStream&#xff09;和功能加强2.5.5.…

OpenSSL--Window生成证书实战

为什么80%的码农都做不了架构师&#xff1f;>>> Windows下使用OpenSSL生成自签证书&#xff08;亲测&#xff09; 一&#xff0c;前言 经常写博客的小伙伴儿都知道&#xff0c;大家一般在前言里面会提到为什么写这篇博客&#xff0c;而我这篇博客 主要是探讨OpenSS…

python绘制反比例函数_描点法画反比例函数图像的动态演示——数学软件GeoGebra制作教程...

Gif动态图又又又上传不成功了&#xff0c;建议跳转链接查看全文&#xff1a;描点法画反比例函数图像的动态演示--数学软件GeoGebra制作教程​www.toutiao.com关于描点法画函数图像&#xff0c;前面已有三篇&#xff0c;包括以一次函数为例的&#xff1a;有老师说&#xff0c;希…

制作巴士电台彩蛋一枚

内容暂不透露哈&#xff0c;自己摸索&#xff0c;假如玩过魂斗罗&#xff0c;或知道google reader的彩蛋的话&#xff0c;那么巴士的彩蛋你应该也能试出来&#xff0c;哈哈 纯粹为增加点欢乐感~~