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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

Hsiaoyang:Google搜索结果页面分析

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

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

最近“文艺复兴”又流行起来了&#xff0c;这一次遭殃的是80和90后的童年偶像——水兵月。在推特“重绘水兵月”的标签下&#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…

7年赚的2个亿,数学家6年就花光了,全砸在自家的房子上

全世界只有3.14 % 的人关注了爆炸吧知识提到数学家&#xff0c;我以为是这样的&#xff1a;发际线不低&#xff0c;面部表情匮乏&#xff0c;总爱是写外星符号。然而却是这样的&#xff0c;刚刚还在讲sin、cos,一转头就掏出一把小提琴&#xff0c;超高难度的帕格尼尼随想曲说来…

iOS-Runtime知识点整理

本文目录 1.Runtime简介2.Runtime相关的头文件3.技术点和应用场景 3_1.获取属性\成员变量列表3_2.交换方法实现3_3.类\对象的关联对象,假属性3_4.动态添加方法&#xff0c;拦截未实现的方法3_5.动态创建一个类4.面试题-1.Runtime简介回到顶部1.Runtime简介 因为Objc是一门动态语…

人人年薪百万?醒醒!

今天刷知乎&#xff0c;看见一个很有趣的帖子&#xff1a;中青校媒的一份调查结果显示&#xff1a;67.65%的大学生评估自己10年内会年薪百万。这个帖子下面一堆答主在那疯狂的讽刺挖苦&#xff0c;觉得年轻人什么都不懂就会幻想。我倒是觉得年轻人对未来充满憧憬和希望反而是好…

sql not exists用法_SQL Server 2012 高级用法(一)

最近用到了SQL Server 相关数据库等问题&#xff0c;于是整理了如下SQL Server高级用法系列。该系列不再介绍基础用法(select ,insert, update, delete, and or ,order by 等)。本文将介绍高级用法&#xff1a;Top, Like,通配符。三种高级用法。TOP Top 子句用于规定要返回的记…

谈谈女友卸妆后的感受?

1 2 医生和她的实习助手3 那个&#xff0c;打针的话能不能轻点呀4 ok&#xff0c;学会了 图自青鲤5 有点甜~6 一个人可以无聊到什么程度&#xff1f;7 所谓的前翻乾坤无敌轮回抓鱼大法。。8 《请回答1988》中的珍珠饰演者金雪演唱插曲《惠化洞》&#xff08;来源于weibo&#x…

隐形材料你见过吗?

1 提前锻炼&#xff0c;为春运做准备2 隐形的聚合物3 黄山西海地轨电车好像驶入了画中.....4 大猪蹄子&#xff0c;就是喜欢年轻的5 现在的小学生太会了吧&#xff01;6 当狗穿上了鞋&#xff0c;脚就不是自己的脚了~7 你仿佛在说我是王八&#xff1f;&#xff1f;&#xff1f;…

java中可以用浮点作为循环变量吗_Java千问:Java循环语句的几个冷门知识点你都知道吗?...

我们在进行Java开发的时候&#xff0c;经常会用到循环结构&#xff0c;但是有几个关于循环的“冷门”知识点&#xff0c;不知道你是不是都已经掌握了呢&#xff1f;我们一起来看看一、大括号可以不写吗&#xff1f;我们都知道&#xff0c;如果每次循环过程中要执行的语句只有一…

各个大学的录取通知书,哪个颜值最高?

近段时间&#xff0c;各大高校纷纷开始晒出自家的录取通知书&#xff0c;快来和小天一起评评哪家的颜值最高&#xff01;北京工业大学北京科技大学东南大学复旦大学哈尔滨工业大学南京农业大学南开大学清华大学天津大学西安交通大学中国传媒大学北京航空航天大学这不仅仅是一纸…

有关堆栈溢出(in vs 2005)的读书笔记--堆栈中 申请大数组

部分原创 66下一步 Vs 堆栈 理论修改的上限是多少 &#xff1f; 问题2&#xff1a; 全局变量去 最大的上限是多少&#xff1f; 堆栈&#xff08;休养版本测试&#xff09; 2012年3月31日17:31:27 3月 从 10^5到 10^6数组&#xff0c;导致vs… 当前&#xff1a;搭好脚手架…

烧脑又过瘾!这个被严重低估的学习方法,看完瑟瑟发抖!

▲ 点击查看科学家曾在基于脑科学和认知科学后得出一个“学习的金字塔”理论。就是下面这张图&#xff1a;最顶端的就是我们所谓的“知识”&#xff0c;但为了可以达到这个顶端&#xff0c;下面有一系列的支撑能力。而引申出来的核心概念&#xff0c;就叫“玩中学”。不要想当然…

为什么手机最后 10% 的电量很不耐,最后1%的电量最耐用?

全世界只有3.14 % 的人关注了爆炸吧知识手机电量这玩意一直都是个玄学问题。为什么我的小手机&#xff0c;最后 1% 的电量最耐用&#xff0c;每次都够我看完一个十分钟的视频。又或者是为什么我的小手机&#xff0c;最后 10% 的电量很不耐用。。。每次电池报警还有 10% 的电量&…