通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布...

 之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能——订阅发布

目录:
一、通过Dapr实现一个简单的基于.net的微服务电商系统

二、通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

三、通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr

附录:(如果你觉得对你有用,请给个star)
一、电商Demo地址:https://github.com/sd797994/Oxygen-Dapr.EshopSample

二、通讯框架地址:https://github.com/sd797994/Oxygen-Dapr

  惯例我们还是再老生常谈一下什么是订阅发布,订阅发布是根据设计模式之观察者模式发展出来的一种软件系统设计思想,它的核心是指“多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。假设一个系统有ABC三个模块其中BC依赖于A,当A进行改变后需要A主动调用BC进行相应改变,而观察者模式则将A的控制权剥离,A改变之后只是发送一个事件给消息总线“我改变了”,BC通过预先订阅该主题而获取到A的状态变化,再进行自身的状态变更。

强耦合调用模式

通过消息中间件订阅发布模式

  聪明的同学应该发现了,通过订阅发布其实我们是将以往强耦合的ABC通过巧妙的控制权转移的方式进行了解耦,由之前的BC依赖于A改为了BC依赖于消息组件,通过消息组件接受到A的消息后进行分发,这样设计系统的目的当然有好有坏,好处是这会大大提高A的吞吐量,假设以往操作ABC总耗时300ms平均单个操作耗时100ms,通过解耦后A耗时100ms后就可以马上返回线程。那坏处是什么呢,由于对BC进行了解耦往往状态的一致性就得不到保障了。当ABC处于同一个粗粒度的原子操作里(比如数据库事务操作、比如lock锁),我们很容易控制ABC的强一致性,ABC有一个操作失败可以很轻松的进行回滚而不用影响我们持久化设备的数据一致。另外由于需要依赖第三方中间件,整个系统的健壮性是会有一定影响的。另外还需要考虑订阅方消费失败、异常后如何处理。关于这部分内容这里我们就不展开了,如果大家确实感兴趣,推荐大家看看国内开源作者@杨晓东写的.netcore分布式一致性解决方案CAP,地址:https://github.com/dotnetcore/cap

  OK,老生常谈的部分唠完,咱今天就来唠唠在Dapr中如何实现订阅发布的。通过上面的部分大家应该知道如果要实现一个进程间的订阅发布系统,我们需要准备很多东西,其中一个是事件总线,事件总线的作用是让事件发布者可以通过该模块进行事件发布。第二个需要选型一个消息组件,第三需要订阅器对订阅特定类型组件的技术支持。由于每一种组件其协议和接口实现方式都不同,在传统的订阅发布设计中我们往往需要对某种特定类型的消息组件在基础设施层进行相应的SDK集成,通过为业务层提供事件总线接口和订阅接口来进行技术解耦。就算做到了业务系统中不耦合技术实现,往往我们也很难替换消息组件。而Dapr在这方面为开发者集成了相当一部分的主流订阅发布组件(通过该支持列表可预览支持)。同时在业务层面是完全基于http+谓词的形式来实现订阅发布的。这就大大降低了引入SDK产生的成本。

  订阅发布的API如下:

POST http://localhost:<daprPort>/v1.0/publish/<pubsubname>/<topic>[?<metadata>]
GET http://localhost:<appPort>/dapr/subscribe

  稍微说一下这两个接口的含义,第一个接口告诉sidecar,我们将会调用某个已申明的类型为pubsub的component发送我们的事件到特定的topic

  第二个接口是告诉sidecar我们当前这个服务会订阅哪些topic,我们提供的订阅器入口地址是什么,我们只接受哪一个component发布的数据

  也就是说和服务调用一样,我们只需要一个weapi+httpclient就可以实现一个订阅发布模式而,其他的一切都交给dapr好了。

  现在我们来看看如何实现它,首先我们还是需要选一个特定的订阅发布组件,这里我就选择redis,通过redis5.0新增的stream来做订阅发布。搭建redis这里不赘述,搭建好之后,我们需要创建一个dapr的特定CRD Component来申明引用该组件,其申明yaml文件如下

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: pubsub
spec:type: pubsub.redisversion: v1metadata:- name: redisHostvalue: redis.infrastructure.svc.cluster.local:6379

  其中的type是由Dapr预定义的,可以参考这里,不要随意改变。metadata是对组件的一组描述包括其地址、账号密码等等,由于是演示这里我就直接使用k8s创建了一个无密码的redis pod并暴露其6379端口到svc。当我们创建好并通过kubectl apply -f x.yaml后,可以在dashboard的Componsents页面观察是否已经创建成功

  基础设施准备完毕,接下来就是打开我们的项目看看如何实现订阅发布了。首先我们还是要把上一章的解决方案打开,上一章不是通过client发起一个对service的调用吗,今天我们反着来演示,我们在client创建一个订阅器,当clientsample调用servicesample时让servicesample发布一个事件,由该订阅器订阅并打印出文本到控制台。

  首先我们在clientsample创建一个订阅器,订阅器类必须继承ieventhandle接口,其订阅方法体必须添加EventHandlerFunc注解并申明需要订阅的主题(topic),订阅器接收参数必须以EventHandleRequest<T>的方式接收,否则反序列化器可能会收不到请求。最后ack必须以DefaultEventHandlerResponse.Default的方式返回,否则事件总线会认为本次订阅器消费失败,会重复推送。

   需要在我们的hostbuilder里注册这个对象到ioc容器:

  接着我们在RPC接口项目创建事件Data HelloEventData,其中之包含一个演示用的words字段(图略)。

  接下来我们在上一章的HelloServiceImpl中注入一个事件总线,并发送事件:

 

   一切就绪,我们重新按照上一章的内容打包并部署,然后开启postman和控制台日志观看结果,可以看到我们的clientsample发起一个服务调用后,我们的serversample回调并发送了事件,而clientsample成功订阅到了该事件并消费掉了。

 

   今天的分享到此为止,demo只是对dapr订阅发布最基础功能的演示,真正到生产环境还需要客服诸多问题来提高系统健壮,系统建设是一个长期持续的过程。欢迎大家评论区留言讨论~ 下期我们将讲一下dapr里如何做状态管理以及actor模型

相关文章:

  • Dapr能否引领云原生中间件的未来?

  • 云原生 | 阿里巴巴的Dapr实践与探索

  • Dapr | 云原生的抽象与实现

  • Dapr 可视化指南

  • Dapr 知多少 | 分布式应用运行时

  • Dapr 正式发布 1.0

  • Dapr 交通流量控制示例

  • Dapr是如何简化微服务的开发和部署

  • 微软开源微服务运行时Dapr,赋能云原生应用开发

  • Dapr微服务应用开发系列0:概述

  • Dapr微服务应用开发系列1:环境配置

  • Dapr微服务应用开发系列2:Hello World与SDK初接触

  • Dapr微服务应用开发系列3:服务调用构件块

  • Dapr微服务应用开发系列4:状态管理构件块

  • Dapr微服务应用开发系列5:发布订阅构建块

  • Windows环境下Dapr入门

  • 云原生 | .NET 5 with Dapr 初体验

  • 通过Dapr实现一个简单的基于.net的微服务电商系统

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr

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

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

相关文章

值得收藏的Python小技巧:这17个骚操作你都OK吗?

导读&#xff1a;Python 是一门非常优美的语言&#xff0c;其简洁易用令人不得不感概人生苦短。在本文中&#xff0c;作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Python 技巧&#xff0c;例如查找、分割和合并列表等&#xff0c;这 17 个技巧都非常简单&#xff0c;但…

等待十年,史上第一个 64 位版 Visual Studio 将于今夏公开首个预览版!

昨日&#xff0c;微软在其开发者博客宣布了一则重磅消息——Visual Studio 2022 首个预览版将于今年夏季发布 &#xff0c;并且终于成为万众期待的 64 位版&#xff01;要知道&#xff0c;早在 2011 年就有用户在 Visual Studio 的反馈建议网站提出&#xff0c;希望微软开发 64…

普通人和程序员看到的树

IT程序猿 微博网友评论&#xff1a;小苏打_sct&#xff1a;我家门前有两棵树&#xff0c;一棵是二叉树&#xff0c;另一棵也是二叉树( _ゝ&#xff40;)Christible_L&#xff1a;这不是多叉树吗 北辰找不着北&#xff1a;程序员都是从根看起的~ 洱海不语&#xff1a;先先总体到…

华为高性能服务器刀箱,云平台服务器刀箱

云平台服务器刀箱 内容精选换一换将外部镜像文件注册成云平台的私有镜像后&#xff0c;您可以使用该镜像创建新的云服务器&#xff0c;或对已有云服务器的系统进行重装和更换。本节介绍使用镜像创建云服务器的操作。您可以按照通过镜像创建云服务器中的操作指导创建弹性云服务器…

Magicodes.IE.AspNetCore之一行代码多格式导出

主要步骤1.安装包Install-Package Magicodes.IE.AspNetCore2.开始配置在Startup.cs的Configure()方法中,在UseRouting()中间件之后,注册如下中间件public void Configure(IApplicationBuilder app) {app.UseRouting();app.UseMagiCodesIE();app.UseEndpoints(endpoints >{en…

想不到吧,这些都能用R!

R作为一种统计分析软件&#xff0c;广泛应用于生物、医学、电商、新闻等数据相关行业&#xff0c;是目前主流数据应用软件之一。那么&#xff0c;R到底有哪些特别之处呢?实际上&#xff0c;R是统计领域广泛使用的S语言的一个分支&#xff0c;两者在程序语法上几乎一样&#xf…

ssd windows未能启动服务器,ssd安装win10无法启动你安装方法对吗?来看一下

固态硬盘虽然价格偏高&#xff0c;但是读写速度快&#xff0c;很多人只追求速度&#xff0c;纷纷买了全新固态硬盘安装系统&#xff0c;现在最新的系统是win10&#xff0c;如果在uefi电脑上用固态硬盘安装win10&#xff0c;那么速度将有质的提升&#xff0c;那么全新固态硬盘怎…

一名IT经理是如何把项目带崩的。。。

我是一名项目经理&#xff0c;在过去的四个月里&#xff0c;我把一个项目带崩了&#xff08;上线后频出问题&#xff0c;用户无法使用&#xff09;。在最近的几天&#xff0c;我每天都在反思自己&#xff0c;我都在问自己以下几个问题&#xff1a;1.我做错了什么&#xff1f;2.…

C# 线程池ThreadPool用法简介

前言&#xff1a;自从task出现后&#xff0c;threadpool地位直线下降&#xff0c;但是一些老的程序员用惯了threadpool&#xff0c;我们在继承开发的时候也会时常看到这个用法&#xff0c;所以我们也很有必要熟悉认识它。什么是线程池&#xff1f;为什么要用线程池&#xff1f;…

10分钟采集凡客最新的省、市、区、邮政编码和电话区号(附源码)

最近的开发的项目需要用到省、市、区数据&#xff0c;因为要开发的项目也是电子商务网站&#xff0c;在参考凡客的用户体验时&#xff0c;发现它连深圳最新分离出来的光明新区都有了&#xff0c;拍拍网都没有更新数据&#xff0c;看来凡客在数据更新方面还是挺负责的&#xff0…

刘强东在美国出事了,老老实实的IT男,真的是有钱就变坏吗?

9月2日&#xff0c;网络上流传京东集团创始人刘强东在美国明尼苏达州&#xff0c;涉嫌性侵女大学生&#xff0c;目前已经被保释的消息。刘强东的相关信息&#xff0c;是可以直接在明尼苏达州Hennepin郡治安官办公室的监狱名单上查到的。上图中&#xff0c;可以看到指控描述为cr…

记一次 .NET游戏站程序的 CPU 爆高分析

一&#xff1a;背景 1. 讲故事上个月有个老朋友找到我&#xff0c;说他的站点晚高峰 CPU 会突然爆高&#xff0c;发了两份 dump 文件过来&#xff0c;如下图&#xff1a;又是经典的 CPU 爆高问题&#xff0c;到目前为止&#xff0c;对这种我还是有一些经验可循的。抓 2-3 个 du…

干货 | 数据挖掘过关40题

今天为大家准备了40道数据挖掘的题&#xff0c;试试你的能力吧&#xff01;答案请见文末1.某超市研究销售纪录数据后发现&#xff0c;买啤酒的人很大概率也会购买尿布&#xff0c;这种属于数据挖掘的哪类问题&#xff1f;A.关联规则发现B.聚类C.分类D.自然语言处理2.以下两种描…

.Net程序内存泄漏解析

↑↑↑ 点击左上角蓝字关注我&#xff0c;为您提供技术新动态。本期内容分享实战中内存泄漏解决思路。Part1 初步分析原因Part2 查找内存泄漏的根本原因Part2.1 解决方案Part3 总结Part4 彩蛋一、概要大概在今年三月份的时候突然被紧急调到另外一个项目组解决线上内存泄漏问题。…

js 上下箭头滚动_JS中的this完全讲解,再也不会被this搞晕了

关于This对象js 中的this 是一个比较难理解的对象&#xff1b;所以也经常作为面试的考点&#xff0c;考察应聘者的js 基础能力&#xff1b;其实this的指向也就那么几种情况&#xff0c;接下来我们一一看一下&#xff1a;函数中的this取何值是在函数真正被调用时确定的(也就是运…

9张图,Kafka为什么要放弃Zookeeper

最近&#xff0c;confluent社区发表了一篇文章&#xff0c;主要讲述了Kafka未来的2.8版本将要放弃Zookeeper&#xff0c;这对于Kafka用户来说&#xff0c;是一个重要的改进。之前部署Kafka就必须得部署Zookeeper&#xff0c;而之后就只要单独部署Kafka就行了。[1]1.Kafka简介Ap…

Python能用来做什么?以下是Python的三大主要用途

如果你想学Python&#xff0c;或者你刚开始学习Python&#xff0c;那么你可能会问&#xff1a;“我能用Python做什么&#xff1f;”这个问题不好回答&#xff0c;因为Python有很多用途。但是随着时间&#xff0c;我发现有Python主要有以下三大主要应用&#xff1a; Web开发 数据…

qbuttongroup如何都不选中_全程马拉松,半程马拉松该如何跑?很多人都不知道这些细节...

现在已经到12月份了&#xff0c;全国各地的马拉松也接近尾声&#xff0c;回想自己这一年参加了多少次全程马拉松或半程马拉松&#xff1f;很多人跑步最初的宗旨是为了减肥、为了健康&#xff0c;为了让自己拥有一个好身体&#xff0c;可是不知不觉中在朋友又或自己的兴趣中“投…

通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理...

状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容&#xff0c;今天我们来讲讲状态管理。目录&#xff1a;一、通过Dapr实现一个简单的基于.net的微服务电商系统二、通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解…

过Div将页面分三块(上,中,下),然后通过Ext来改变Content的内容(三)--终结版

2019独角兽企业重金招聘Python工程师标准>>> 这几天的页面重构终于快要结束了。 最终页面架构选择了Sitemesh&#xff0c;经过昨天下午及今天上午的调试终于把Sitemesh下css、js问题解决了。 使用Sitemesh总结以下几点&#xff1a; 1、<decorator:head />放在…