Dapr(三) Dapr核心组件的使用一

结合前两期 Dapr(一) 基于云原生了解Dapr(Dapr(一) 基于云原生了解Dapr-CSDN博客) Dapr(二) 分布式应用运行时搭建及服务调用(Dapr(二) 分布式应用运行时搭建及服务调用-CSDN博客)

下篇推出dapr服务注册与发现,dapr组件绑定,dapr Actor功能。

目录

1.0 Dapr状态管理

1.1 Dapr状态组件配置文件

1.2 状态控制器

1.3 切换其它状态存储

1.4 工作原理

2.0 发布订阅

2.1 什么是发布订阅

2.2 设置发布订阅组件

2.3 控制器代码

2.3.1 发布控制器

2.3.2 订阅控制器

2.4 修改文件Program.cs

2.5 切换组件 

2.6 工作原理

总结:


1.0 Dapr状态管理

Dapr的状态管理允许应用程序保存和检索键值对数据,具有可插拔的存储、配置的行为和额外的安全特性。以下是主要特点:

  1. 可插拔状态存储:Dapr支持多种数据存储,比如MySQL、Redis、Azure CosmosDB等,可以在不修改代码的情况下切换。

  2. 配置存储行为:你可以指定并发控制和一致性级别。默认是最终一致性,但也支持强一致性。

  3. 并发控制:通过ETags实现乐观并发控制(OCC)。写操作需要匹配当前的ETag值,防止冲突。

  4. 自动加密:预览功能,支持应用程序状态的自动加密和密钥轮换。

  5. 一致性选项:可以选择强一致性的写入,等待所有副本确认,或者默认的最终一致性。

  6. 批量操作:支持一次性处理多条状态记录。

1.1 Dapr状态组件配置文件

Dapr默认使用的Redis进行存储。

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

1.2 状态控制器

 public class StateController : ControllerBase{private readonly ILogger<StateController> _logger;private readonly DaprClient _daprClient;public StateController(ILogger<StateController> logger, DaprClient daprClient){_logger = logger;_daprClient = daprClient;}// 获取一个值[HttpGet]public async Task<ActionResult> GetAsync(){var result = await _daprClient.GetStateAsync<string>("statestore", "guid");return Ok(result);}//保存一个值[HttpPost]public async Task<ActionResult> PostAsync(){await _daprClient.SaveStateAsync<string>("statestore", "guid", Guid.NewGuid().ToString(), new StateOptions() { Consistency = ConsistencyMode.Strong });return Ok("done");}//删除一个值[HttpDelete]public async Task<ActionResult> DeleteAsync(){await _daprClient.DeleteStateAsync("statestore", "guid");return Ok("done");}//通过tag防止并发冲突,保存一个值[HttpPost("withtag")]public async Task<ActionResult> PostWithTagAsync(){var (_, etag) = await _daprClient.GetStateAndETagAsync<string>("statestore", "guid");await _daprClient.TrySaveStateAsync("statestore", "guid", Guid.NewGuid().ToString(), etag);return Ok("done");}//通过tag防止并发冲突,删除一个值[HttpDelete("withtag")]public async Task<ActionResult> DeleteWithTagAsync(){var (_, etag) = await _daprClient.GetStateAndETagAsync<string>("statestore", "guid");return Ok(await _daprClient.TryDeleteStateAsync("statestore", "guid", etag));}// 从绑定获取一个值,健值name从路由模板获取[HttpGet("frombinding/{name}")]public ActionResult GetFromBindingAsync([FromState("statestore", "name")] StateEntry<string> state){return Ok(state.Value);}// 根据绑定获取并修改值,健值name从路由模板获取[HttpPost("withbinding/{name}")]public async Task<ActionResult> PostWithBindingAsync([FromState("statestore", "name")] StateEntry<string> state){state.Value = Guid.NewGuid().ToString();return Ok(await state.TrySaveAsync());}// 获取多个个值[HttpGet("list")]public async Task<ActionResult> GetListAsync(){var result = await _daprClient.GetBulkStateAsync("statestore", new List<string> { "guid" }, 10);return Ok(result);}// 删除多个个值[HttpDelete("list")]public async Task<ActionResult> DeleteListAsync(){var data = await _daprClient.GetBulkStateAsync("statestore", new List<string> { "guid" }, 10);var removeList = new List<BulkDeleteStateItem>();foreach (var item in data){removeList.Add(new BulkDeleteStateItem(item.Key, item.ETag));}await _daprClient.DeleteBulkStateAsync("statestore", removeList);return Ok("done");}}

1.3 切换其它状态存储

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: statestore
spec:type: state.mysqlversion: v1metadata:- name: connectionStringvalue: "root:123456@tcp(192.168.157.157:3306)/?allowNativePasswords=true"

切换状态为MySql进行存储。

1.4 工作原理

应用程序与 Dapr sidecar 交互,以存储和检索键/值数据。 在底层,sidecar API 使用**可配置的状态存储组件**来保存数据。 开发人员可以从不断增长的受支持状态存储集合中选择,其中包括 Azure Cosmos DB、SQL Server 和 Cassandra。

2.0 发布订阅

2.1 什么是发布订阅

发布订阅(Publish-Subscribe)是一种通信模式,允许发布者发送消息到一个中心节点(通常是消息代理或主题),而不关心具体哪些订阅者会接收到这些消息。订阅者则注册他们感兴趣的特定类型的消息,当匹配的消息发布时,他们会收到通知。这种模式的特点在于解耦了发布者和订阅者,提高了系统的灵活性和可扩展性。

关键元素包括:

  1. 发布者 (Publisher): 生产消息的实体,它向主题或消息代理发送消息,无需了解谁会接收这些消息。
  2. 订阅者 (Subscriber): 对特定消息感兴趣并希望接收通知的实体,它们通过订阅主题或消息代理来表达兴趣。
  3. 主题 或 消息代理 (Topic or Message Broker): 中间媒介,接收并分发消息,确保消息从发布者到达正确的订阅者。

一个简单的示例是新闻系统,其中发布者发布新闻到特定类别,而订阅者选择关注他们感兴趣的类别。发布者不直接通知订阅者,而是通过消息代理进行,这样订阅者仅接收与其订阅相匹配的新闻。

发布订阅模式的应用场景通常涉及异步通信、事件驱动的系统或需要解耦组件的场景。

2.2 设置发布订阅组件

Dapr默认使用的Redis进行发布订阅

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

2.3 控制器代码

2.3.1 发布控制器

    [ApiController][Route("[controller]")]public class PubsubController : ControllerBase{private DaprClient _daprClient;private ILogger<PubsubController> _logger;public PubsubController(DaprClient daprClient, ILogger<PubsubController> logger){_daprClient = daprClient;_logger = logger;}/// <summary>/// 发布消息的方法/// </summary>/// <returns></returns>[HttpPost][Route("pub")]public async Task<IActionResult> PublishMessage(){_logger.LogInformation("***发布消息***");var data = new UserInfo(10001,"操作员",19);await _daprClient.PublishEventAsync("pubsub", "user_topic",data);return Ok("***发布消息成功***");}}

2.3.2 订阅控制器

    [ApiController][Route("[controller]")]public class SubController : ControllerBase{private ILogger<SubController> _logger;public SubController(ILogger<SubController> logger){_logger = logger;}[HttpPost("sub")][Topic("pubsub", "user_topic")]public IActionResult ConsumerMessage(UserInfo user){_logger.LogInformation("***消费消息***");Console.WriteLine($"userId:{user.UserId} userName:{user.UserName}");return Ok();}}

2.4 修改文件Program.cs

app.UseCloudEvents();
app.MapSubscribeHandler();

2.5 切换组件 

切换为RabbitMQ

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: pubsubnamespace: default
spec:type: pubsub.rabbitmqversion: v1metadata:- name: hostvalue: "amqp://123:123@192.168.157.157:5672"- name: durablevalue: "false"- name: deletedWhenUnusedvalue: "false"- name: autoAckvalue: "false"- name: deliveryModevalue: "0"- name: requeueInFailurevalue: "false"- name: prefetchCountvalue: "0"- name: reconnectWaitvalue: "0"- name: concurrencyModevalue: parallel- name: backOffPolicyvalue: "exponential"- name: backOffInitialIntervalvalue: "100"- name: backOffMaxRetriesvalue: "16"

2.6 工作原理

Dapr 发布&订阅构建基块提供了一个与平台无关的 API 框架来发送和接收消息。服务将消息发布到指定主题, 业务服务订阅主题以使用消息。服务在 Dapr sidecar 上调用 pub/sub API。 然后,sidecar 调用预定义 Dapr pub/sub 组件。

总结:

Dapr的发布订阅功能使得在分布式系统中实现发布/订阅消息模式变得更加简单。主要解决了不同消息产品之间实施复杂性和功能差异的问题。你可以通过Dapr的Sidecar API使用HTTP或gRPC来发布和订阅消息。以下是关键操作的概述:

  1. 发布(Publish)消息

    • 使用http://localhost:<dapr-port>/v1.0/publish/<pub-sub-name>/<topic> URL,其中 <dapr-port> 是Dapr Sidecar监听的端口,<pub-sub-name> 是选择的发布/订阅组件名,而 <topic> 是消息的目标主题。
  2. 订阅(Subscribe)消息

    • 应用程序在启动时,通过http://localhost:<appPort>/dapr/subscribe指定其订阅,其中 <appPort> 是应用程序监听的端口。
    • 订阅者处理消息后返回非错误响应,Dapr认为消息传递成功。
    • 支持订阅者通过响应负载中的状态进行精细化控制,比如指示重试(RETRY)或丢弃(DROP)消息。

Dapr的状态管理提供了一种跨服务持久化数据的方法,支持多种存储后端。关键特性包括:

  1. 原子性操作:支持原子性的读写操作,保证一致性。

  2. 版本控制:允许跟踪状态更改的历史版本,便于回滚。

  3. 事件驱动:状态变化可触发回调函数,实现基于状态变化的自动化操作。

  4. 过期策略:可设置状态项的过期时间。

  5. 备份与恢复:提供状态备份和恢复机制,确保高可用性。 

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

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

相关文章

中颖51芯片学习2. IO端口操作

一、SH79F9476 I/O端口介绍 1. 特性 SH79F9476提供了30/26位可编程双向 I/O 端口&#xff1b;端口数据在寄存器Px中&#xff1b;端口控制寄存器PxCRy是控制端口作为输入还是输出&#xff1b;端口作为输入时&#xff0c;每个I/O端口均带有PxPCRy控制的内部上拉电阻。有些I/O引…

超详细!211页网络协议与管理,看完终于明白了(建议收藏)

与其说计算机改变了世界&#xff0c;不如说是计算机网络改变了世界。作为计算机网络通信实体之间的语言&#xff0c;网络通信协议对计算机正常通信起着极大的作用。 那么到底什么是网络协议与管理呢&#xff1f;今天给大家分享一份211页网络协议与管理文档&#xff0c;包含概念…

碧桂园服务净利降两成,关联交易收入仅占2.9%,发力增值服务充电桩日进超10万

自2018年分拆上市以来&#xff0c;碧桂园服务经历过非常高速的发展&#xff0c;曾是物管市场的“并购王”&#xff0c;但从2023年开始&#xff0c;希望从外延式的增长向内生式增长转型&#xff0c;将往期的经验与教训&#xff0c;通过投后管理沉淀下来&#xff0c;向高质量发展…

nginx多https证书配置精简

其实有很多方式&#xff0c;网上看到一个这个方法&#xff0c;给大家介绍一下。 首先&#xff0c;开启支持-TLS SNI support Nginx开启单IP多SSL证书支持-TLS SNI support Nginx支持单IP多域名SSL证书需要OpenSSL支持&#xff0c;首先需要编译安装一个高版本的openssl。 检查…

04 Python进阶:MySQL-PyMySQL

什么是 PyMySQL&#xff1f; PyMySQL 是一个用于 Python 的纯 Python MySQL 客户端库&#xff0c;提供了与 MySQL 数据库进行交互的功能。PyMySQL 允许 Python 开发人员连接到 MySQL 数据库服务器&#xff0c;并执行诸如查询、插入、更新和删除等数据库操作。 以下是 PyMySQL …

第29篇:秒表计时器

Q&#xff1a;本期我们采用计数器来实现秒表计时器&#xff0c;循环进行0~9计时。 A&#xff1a;在数码管HEX0上循环从0到9计数&#xff0c;间隔时间为1s&#xff0c;使用计数器实现1s时间间隔。 DE2-115开发板提供了50MHz时钟&#xff0c;触发器直接以50MHz信号作为同步时钟…

过亿级别的用户数据如何检查用户名是否存在?

目录 引言用户名存在性检查的挑战用户规模庞大带来的性能挑战数据一致性与并发性问题防止恶意行为的挑战 常见的解决方案基于数据库的方案基于缓存的方案基于分布式系统的方案基于搜索引擎的方案 案例分析与实践经验分享社交媒体平台的用户名检查方案 引言 随着互联网的普及和数…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(9)复发

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 第一课 ——第三课素材文件 https://www.alipan.c…

怎么在UE过场动画中加入振动效果

我们已经学会了怎么在游戏中加入振动效果&#xff0c;比较典型的交互场景如&#xff1a;在开枪时让手柄同步振动&#xff0c;实现起来真的很简单&#xff0c;就是定义场景和事件&#xff0c;然后在游戏事件发生时播放特定的振动资源文件&#xff0c;跟播放音效是极其相似的&…

探索Linux的挂载操作

在Linux这个强大的操作系统中&#xff0c;挂载操作是一个基本而重要的概念。它涉及到文件系统、设备和数据访问&#xff0c;对于理解Linux的工作方式至关重要。那么&#xff0c;挂载操作究竟是什么&#xff0c;为什么我们需要它&#xff0c;如果没有它&#xff0c;我们将面临什…

基因组de novo组装

分以下几个部分&#xff1a; CLR组装 HIFI组装 ONT组装 二、三代数据矫正 组装结果评估 一、CLR组装 下机数据&#xff1a; 主要用那个bam文件 软件&#xff1a;wtdbg2 第一步&#xff1a;bam转fasta文件 参考&#xff1a;https://www.jianshu.com/p/03c7eb11102d # 进行基…

基于单片机放大电路程控放大特性参数设计

**单片机设计介绍&#xff0c;基于单片机放大电路程控放大特性参数设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机放大电路程控放大特性参数设计是一个结合了单片机编程和放大电路技术的综合性项目。以下是对该设计项目的概…

第⑪讲:Ceph集群OSD扩容方案及实现横向和纵向扩容

文章目录 1.Ceph集群OSD扩容方案2.实现OSD的横向扩容4.实现OSD的纵向扩容 1.Ceph集群OSD扩容方案 Ceph集群OSD的扩容支持两种方式&#xff1a; 横向扩容 通过增加OSD节点来达到扩容的目的。使用横向扩容要完成以下几个步骤&#xff1a; 在新的机器中进行初始化操作、配置Yum源…

AJAX —— 学习(三)(完结)

目录 一、jQuery 中的 AJAX &#xff08;一&#xff09;get 方法 1.语法介绍 2.结果实现 &#xff08;二&#xff09;post 方法 1.语法介绍 2.结果实现 &#xff08;三&#xff09;通用型的 AJAX 方法 1.语法介绍 2.结果实现 二、AJAX 工具库 axios &#xff08…

idea开发 java web 高校学籍管理系统bootstrap框架web结构java编程计算机网页

一、源码特点 java 高校学籍管理系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 css jq…

人工智能、深度伪造和数字身份:企业网络安全的新前沿

深度伪造&#xff08;Deepfakes&#xff09;的出现打响了网络安全军备竞赛的发令枪。对其影响的偏执已经波及到一系列领域&#xff0c;包括政治错误信息、假新闻和社交媒体操纵。 深度伪造将加剧公共领域对信任和沟通的本已严峻的压力。这将理所当然地引起监管机构和政策制定者…

Ubuntu22.04安装Anaconda

一、下载安装包 下载地址&#xff1a;https://www.anaconda.com/download#Downloads 参考&#xff1a;Ubuntu下安装Anaconda的步骤&#xff08;带图&#xff09; - 知乎 下载Linux 64-Bit (x86) installer 二、安装 在当前路径下&#xff0c;执行命令&#xff1a; bash Ana…

每日面经:计算机网络part1

1. 计算机网络的组成部分有哪些&#xff1f; a. 硬件设备&#xff1a;计算机网络由各种硬件设备组成&#xff0c;包括计算机、服务器、路由器、交换机、网卡等。这些设备通过物理连接&#xff08;如网线、光纤&#xff09;相互连接。 b. 协议&#xff1a;计算机网络中的通信需…

硬件项目开发过程详细介绍

对于很多未毕业的学生以及刚参加工作的工程师&#xff0c;经常弄不清楚硬件项目的开发过程&#xff1f;本文将通过详细的步骤来对硬件项目开发过程进行详细的介绍。 硬件项目开发是一个复杂而精细的过程&#xff0c;需要经过多个阶段来完成。在这个过程中&#xff0c;团队成员…

【智能排班系统】基于SpringSecurity实现登录验证、权限验证

文章目录 SpringSecurity介绍sss-security实现依赖工具类Jwt工具JSON响应工具加密工具类 用户上下文用户信息实体类用户上下文 自定义重写自定义无权限的报错自定义密码加密自定义用户类 过滤器登录过滤器权限过滤器 Service登录Service 配置类说明登录验证权限验证IP流量限制 …