Dapr(四) Dapr核心组件的使用二

结合前三期 Dapr(一) 基于云原生了解Dapr(Dapr(一) 基于云原生了解Dapr-CSDN博客) Dapr(二) 分布式应用运行时搭建及服务调用(Dapr(二) 分布式应用运行时搭建及服务调用-CSDN博客) Dapr(三) Dapr核心组件的使用一(Dapr(三) Dapr核心组件的使用一-CSDN博客)。下一期使用Dapr中的Actor实现秒杀功能,以及Kubernetes部署Dapr。

目录

1.0 使用外部提供的注册组件(服务的注册与发现)

2.0 组件的绑定

2.1.0 绑定概述

2.2.0 创建绑定(以kafka为例)

2.2.0 输入绑定

2.2.1  使用输入绑定来触发应用程序

2.2.3 监听传入事件

2.3.0 输出绑定

2.3.1 发送事件

3.0 Actor

3.1.0 Actor 概述

3.2.0 Dapr 中的 Actor

3.3.0 Dapr Actors vs. Dapr 工作流程

3.4.0 Actor 生命周期

3.5.0 工作原理

3.6.0 .NET CORE使用Dapr Actor

3.6.1 Nuget引入

3.6.2 Actor接口--抽象

3.6.3 Actor接口实现--细节

3.6.4 Program.cs注册Actor

3.6.5 Actor控制器

总结:


1.0 使用外部提供的注册组件(服务的注册与发现)

docker启动一个consul。

docker run -d -p 8500:8500 --name=consul consul:latest agent -server -bootstrap -ui -node=1 -client='0.0.0.0'

 切换组件。

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:name: daprConfig
spec:tracing:samplingRate: "1"zipkin:endpointAddress: http://localhost:9411/api/v2/spansnameResolution:component: "consul"configuration:client:address: "192.168.157.157:8500"selfRegister: true

2.0 组件的绑定

2.1.0 绑定概述

使用 Dapr 的绑定 API,你可以使用来自外部系统的事件触发应用,并与外部系统交互。 使用绑定 API,可以:

  • 避免与队列和消息总线等消息系统连接和轮询的复杂性。
  • 关注业务逻辑,而不是与系统交互的执行细节。
  • 让您的代码远离 SDK 或库。
  • 处理重试和故障恢复。
  • 在运行时切换绑定
  • 利用特定环境绑定设置构建可移植应用程序,无需更改代码。

例如,有了绑定,您的应用程序就可以响应传入的 Twilio/SMS 消息,而不需要

  • 添加或配置第三方 Twilio SDK
  • 担心来自 Twilio 的轮询(或使用 WebSockets 等)

 在上图中

  • 输入绑定会触发应用程序的一个方法。
  • 在组件上执行输出绑定操作,如 "create"

绑定功能说白了就是可以无缝连接不同的第三方组件,在不修改代码的前提下随意切换组件。之前的微服务架构如果要切换不同的组件都是要修改代码的,现在把这个事情交给dapr,dapr与不同的组件之间进行边车通信。

2.2.0 创建绑定(以kafka为例)

zookeeper。

version: '2'
services:zookeeper:image: wurstmeister/zookeeper:latestports:- "2181:2181"kafka:image: wurstmeister/kafka:latestports:- "9092:9092"environment:KAFKA_ADVERTISED_HOST_NAME: 192.168.157.157KAFKA_CREATE_TOPICS: "topic"KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

 docker启动一个kafka。

docker run -d -p 8080:8080 -v /opt/kafka-map/data:/usr/local/kafka-map/data -e DEFAULT_USERNAME=admin -e DEFAULT_PASSWORD=admin --name kafka-map --restart always dushixiang/kafka-map:latest

 编写绑定配置文件。组件名称为sampletopic。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: sampletopic
spec:type: bindings.kafkaversion: v1metadata:# Kafka broker connection setting- name: brokersvalue: 192.168.157.157:9092# consumer configuration: topic and consumer group- name: topicsvalue: sample- name: consumerGroupvalue: group1# publisher configuration: topic- name: publishTopicvalue: sample- name: authRequiredvalue: "false"

2.2.0 输入绑定

通过输入绑定,可以在外部资源发生事件时触发应用程序。 可选择随请求发送有效载荷和元数据。

2.2.1  使用输入绑定来触发应用程序

通过输入绑定,您可以在外部资源发生事件时触发应用程序。一个外部资源可以是队列、消息管道、云服务、文件系统等。可选择随请求发送有效载荷和元数据。

输入绑定对于事件驱动的处理,数据管道或通常对事件作出反应并执行进一步处理非常理想。Dapr 输入绑定允许您:

  • 接收不包含特定 SDK 或库的事件
  • 在不更改代码的情况下替换绑定
  • 关注业务逻辑而不是事件资源实现

2.2.3 监听传入事件

using System.Collections.Generic;
using System.Threading.Tasks;
using System;
using Microsoft.AspNetCore.Mvc;namespace CheckoutService.controller
{[ApiController]public class SampletopicServiceController : Controller{[HttpPost("/sampletopic")]public ActionResult GetSampletopic([FromBody] string message){Console.WriteLine("Received Message: " + message);}}
}

2.3.0 输出绑定

使用输出绑定,您可以调用外部资源。调用请求可发送可选的有效载荷和元数据。

2.3.1 发送事件

    [Route("api/[controller]")][ApiController]public class BindingsController : ControllerBase{private readonly ILogger<BindingsController> _logger;private readonly DaprClient _daprClient;public BindingsController(ILogger<BindingsController> logger, DaprClient daprClient){_logger = logger;_daprClient = daprClient;}[HttpPost("create")]public async Task SendMessageAsync([FromServices] DaprClient daprClient){var message = "binging功能";  //执行绑定操作:create操作await daprClient.InvokeBindingAsync("sampletopic", "create", message);}}

3.0 Actor

3.1.0 Actor 概述

Actor 模式 将 actor 描述为最低级别的"计算单元"。 换句话说,您将代码写入独立单元 ( 称为actor) ,该单元接收消息并一次处理消息,而不进行任何类型的并行或线程处理。(单线程)

当代码处理消息时,它可以向其他参与者发送一条或多条消息,或者创建新的 Actor。 底层运行时将管理每个 actor 的运行方式,时机和位置,并在 actor 之间传递消息。

大量 actor 可以同时执行,但他们之间是相互独立执行的。

3.2.0 Dapr 中的 Actor

Dapr 包括一个专门实现了虚拟 Actor 模式的运行时。 通过 Dapr 的实现,您可以根据 Actors 模型编写 Dapr Actor,而 Dapr 利用底层平台提供的可扩展性和可靠性保证。

每个 actor 都定义为 actor 类型的一个实例,这与对象作为类的实例的方式相同。 例如,可能存在实现计算器功能的 actor 类型,并且该类型的许多 Actor 分布在集群的各个节点上。 每个此类 actor 都由一个 actor ID 唯一标识。

3.3.0 Dapr Actors vs. Dapr 工作流程

Dapr actors 以状态管理和服务调用 API 为基础,创建有状态的、长期运行的、具有身份标识的对象。 Dapr 工作流和 Dapr Actors 是相关的,工作流建立在 Actors 之上,提供了更高层次的抽象,可以协调一组 Actors,实施常见的工作流模式,并代表您管理 Actors 的生命周期。

Dapr Actors 旨在提供一种在分布式系统中封装状态和行为的方法。 客户端应用程序可根据需要激活 actor。 当一个 actor 被激活时,它会被分配一个唯一的身份,这样它就能在多次调用中保持自己的状态。 这使得 Actors 在构建有状态、可扩展和容错的分布式应用程序时非常有用。

另一方面,Dapr 工作流提供了一种定义和协调复杂工作流的方法,这些工作流涉及分布式系统中的多个服务和组件。 工作流允许你定义一系列需要按特定顺序执行的步骤或任务,可用于实施业务流程、事件驱动工作流和其他类似场景。

如上所述,Dapr 工作流建立在 Dapr Actors 的基础上,管理它们的激活和生命周期。

3.4.0 Actor 生命周期

Dapr Actors 是虚拟的,意思是他们的生命周期与他们的 in - memory 表现不相关。 因此,它们不需要显式创建或销毁。 Dapr Actors 运行时在第一次接收到该 actor ID 的请求时自动激活 actor。 如果 actor 在一段时间内未被使用,那么 Dapr Actor 运行时将回收内存对象。 如果以后需要重新激活,它还将保持对 actor 的一切原有数据。

调用actor方法、定时器和提醒会重置actor的空闲时间。 例如,一个提醒触发会保持actor处于活动状态。

  • 提醒器无论 actor 是活动的还是非活动的都会触发。 如果为非活动 actor 触发,它会首先激活该 actor。
  • Actor 计时器触发会重置空闲时间;然而,计时器只会在 actor 处于活动状态时触发。

空闲超时和扫描间隔是可配置的,Dapr 运行时使用它们来查看 actor 是否可以垃圾回收。 当 Dapr 运行时调用 actor 服务以获取受支持的 actor 类型时,这些信息可以被传递。

由于虚拟 actor 模型的原因,虚拟 actor 生命周期抽象带有一些注意事项,而事实上,Dapr actor 的实现有时会偏离这个模型。

Actor 在第一次有消息发送到它的 actor ID 时就会被自动激活(导致 actor 对象被构建)。 经过一段时间后,actor 对象将被垃圾回收。 在未来,再次使用 actor ID,将导致构建新的 actor 对象。 Actor 的状态比对象的生命周期更久,因为状态存储在 Dapr 运行时的配置状态提供程序中(也就是说 actor 即使不在活跃状态,仍然可以读取它的状态)。

3.5.0 工作原理

Dapr启动app时,Sidecar调用Actors获取配置信息,之后Sidecar将Actors的信息发送到**安置服务**(Placement Service),安置服务会将不同的Actor类型根据其**Id和Actor类型**分区,并将Actor信息**广播到所有dapr实例**。

在客户端调用某个Actor时,安置服务会根据其Id和Actor类型,找到其所在的dapr实例,并执行其方法。

什么时候用Actors

  • 需要单线程执行,比如需要加锁
  • 逻辑可以被划分为小的执行单元

3.6.0 .NET CORE使用Dapr Actor

3.6.1 Nuget引入

<PackageReference Include="Dapr.Actors.AspNetCore" Version="1.13.0" />

3.6.2 Actor接口--抽象

using Dapr.Actors;namespace Dapr_ServiceA.Actors
{/// <summary>/// 定义接口,继承IActor/// </summary>public interface ITestActor : IActor{Task<string> Test();}
}

3.6.3 Actor接口实现--细节

using Dapr.Actors.Runtime;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;namespace Dapr_ServiceA.Actors
{/// <summary>/// 实现这个Actor接口/// </summary>public class TestActor : Actor, ITestActor{public TestActor(ActorHost host) : base(host){}public Task<string> Test(){return  Task.FromResult("TestActor");}}
}

3.6.4 Program.cs注册Actor


using Dapr_ServiceA.Actors;namespace Dapr_ServiceA
{public class Program{public static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);builder.Services.AddControllers().AddDapr();builder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();//注册Actorbuilder.Services.AddActors(options => {options.Actors.RegisterActor<TestActor>();});var app = builder.Build();if (app.Environment.IsDevelopment()){app.UseSwagger();app.UseSwaggerUI();}//引用Actorapp.MapActorsHandlers();app.UseAuthorization();app.MapControllers();app.Run();}}
}

3.6.5 Actor控制器

using Dapr.Actors;
using Dapr.Actors.Client;
using Dapr_ServiceA.Actors;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;namespace Dapr_ServiceA.Controllers
{[Route("api/[controller]")][ApiController]public class ActorController : ControllerBase{private readonly IActorProxyFactory _actorProxyFactory;public ActorController(IActorProxyFactory actorProxyFactory){_actorProxyFactory = actorProxyFactory;}/// <summary>/// 操作同一个资源就要同一个key。/// </summary>/// <param name="Id"></param>/// <returns></returns>[HttpGet("/ActorGet")]public async Task<string> GetAsync(string Id){ITestActor proxy = _actorProxyFactory.CreateActorProxy<ITestActor>(new ActorId("myid-" + Id), "TestActor");return await proxy.Test();}}
}

总结:

Dapr的绑定允许应用与各种外部服务和服务间通信,如数据库、消息队列等,无需关注具体的实现细节。绑定可以用于输入(接收事件)和输出(发布事件)。

对于Actor功能,Dapr提供了Actor模型,它基于Virtual Actors概念,有以下几个关键特性:

  1. 单线程执行:每个Actor实例都在自己的线程中运行,确保操作是原子性的且互不影响。
  2. 无锁并发:内部实现了同步机制,避免开发者手动添加锁,减少死锁的风险。
  3. 资源管理:闲置的Actor会被自动卸载,节省资源;如果节点故障,Actor的状态会迁移到健康节点,保持高可用。
  4. Timer和Reminder:Timer用于定时任务,而Reminder则用于周期性任务且能保证即使Actor重启也能继续执行。

总结起来,Dapr的Actors适合处理具有独立状态和操作的并发场景,并且简化了定时和周期任务的管理。但在某些情况下,如需要低延迟读取Actor状态或高并发的读写操作时,可能需要权衡性能和设计选择。

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

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

相关文章

LangChain-12 Routing By Semantic Similarity 让GPT根据不明确的问题 自动选择工具集 根据语义自动路由

问题背景 平常我们设计程序的时候&#xff0c;会这么写&#xff1a; // 随便举例 String type paramDTO.getType(); if (type.equals("吃饭")) {// do } else if (type.equals("喝水")) {// do } else {// do }此时如果type传入的不是数字&#xff0c;那…

docker使用arthas基本教程

供参考也是自己的笔记 docker容器下使用遇到的问题&#xff1a;大致是连接不上1号进程 我这边主要的问题是用户权限问题&#xff0c;docker容器使用aaa用户启动&#xff0c;那个在docker容器内&#xff0c;需要使用aaa用于启动 docker 容器如何使用arthas #实现下载好arthas …

2604B吉时利2604B数字源表

181/2461/8938产品概述&#xff1a; 型号2604B用于台式应用&#xff0c;不包括TSP-Link、接触检查或数字I/O功能。关于系统使用&#xff0c;请参见型号2602B 吉时利2600B系列源表SMU仪器是业界领先的电流/电压源和测量解决方案&#xff0c;采用了吉时利第三代SMU技术。2600B系…

计算机毕业设计java 基于Android的拼图游戏app

当今社会&#xff0c;随着电子信息技术的发展&#xff0c;电子游戏也成为人们日常生活的一部分。这种娱乐方式结合了日新月异的技术&#xff0c;在游戏软件中结合了多种复杂技术。拼图游戏流行在各种电子产品上&#xff0c;从计算机&#xff0c;掌上游戏机到如今的手机&#xf…

山海鲸智慧交通:可视化技术助力城市交通管理升级

随着城市化进程的加速和汽车保有量的不断增加&#xff0c;交通拥堵、安全事故频发等问题日益凸显。在这样的背景下&#xff0c;智慧交通成为了解决城市交通难题的重要途径。山海鲸智慧交通可视化解决方案&#xff0c;以其创新的技术和卓越的性能&#xff0c;为城市交通管理提供…

1688详情API接口:解锁多元化应用场景java php c++

随着互联网的快速发展&#xff0c;数据交换和信息共享已成为企业日常运营不可或缺的一部分。在这样的背景下&#xff0c;API&#xff08;应用程序接口&#xff09;接口作为实现数据互通的重要工具&#xff0c;受到了越来越多企业的青睐。1688详情API接口作为阿里巴巴旗下的重要…

【算法每日一练]-动态规划(保姆级教程 篇17 状态压缩)

目录 今日知识点&#xff1a; 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1和i-2行进行不断转移 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1行进行状态匹配&#xff0c;然后枚举国王数转移 POJ1185&#xff1a;炮兵阵地 思路&#xff1a; 题目&#xff1a;互…

TRIZ理论在创新实践中的优势体现在哪些地方?

当下&#xff0c;创新已成为推动企业和社会发展的关键动力。TRIZ&#xff0c;即发明问题解决理论。作为一套系统化的创新方法论&#xff0c;它通过分析大量专利和发明案例&#xff0c;总结出一套解决问题的通用方法和流程。那么&#xff0c;TRIZ理论在创新实践中的优势具体体现…

振弦采集仪在地下水位监测中的可行性研究与实践

振弦采集仪在地下水位监测中的可行性研究与实践 地下水位的监测对于水资源管理和地下水环境保护具有重要意义。传统的地下水位监测方法主要包括井水位计、压力传感器和雨水入渗监测等。然而&#xff0c;这些方法存在着一些局限性&#xff0c;如需要人工维护、监测周期长、监测…

KylinOS银河麒麟安装部署AI服务

KylinOS银河麒麟安装部署AI服务&#xff08;CPU版本&#xff09; 查看操作系统 [jnapp8160fcc7cf1b ~]$ nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 6.2.0-36-genericBuild: Kylin Linux…

vue ts 应用梳理

文章目录 前言一、页面传值1.1 [props](https://cn.vuejs.org/guide/components/props.html)1.2 [emit](https://cn.vuejs.org/guide/components/events.html)1.3 [store](https://pinia.vuejs.org/zh/getting-started.html) 二、实时计算2.1 [watch](https://cn.vuejs.org/gui…

ArcGISPro 如何升级某项Python库且不影响其运行

升级包scipy 可以看出scipy当前版本是1.6.2 利用不依赖包升级 pip install --upgrade scipy --no-deps 结果 但是显示还是之前的版本

Linux系统下关闭Java进程

关闭Java进程具体分为两步&#xff1a; 1.ps查进程ID 2.kill杀进程 具体的命令如下&#xff1a; ps查进程ID&#xff1a;ps -ef | grep java kill杀进程&#xff1a;kill -9 对应进程号 linux下解除被占用的端口号&#xff1a; 1.查看8088端口是否被占用&#xff1a; netsta…

【教程】iOS Swift应用加固

&#x1f512; 保护您的iOS应用免受恶意攻击&#xff01;在本篇博客中&#xff0c;我们将介绍如何使用HTTPCORE DES加密来加固您的应用程序&#xff0c;并优化其安全性。通过以下步骤&#xff0c;您可以确保您的应用在运行过程中不会遭受数据泄露和未授权访问的风险。 摘要 …

PD虚拟机软件下载:在 Mac 上流畅运行 Windows 游戏!

本想一台 MacBook 走天下&#xff0c;奈何有些软件仅提供了 Windows 端&#xff0c;在 macOS 上打不开 EXE 文件&#xff0c;比如炒股软件、会计软件、游戏、工科专业软件等。 由于苹果芯片架构的变化&#xff0c;新款 Mac 想要安装双系统已经不太现实&#xff0c;有没有更简单…

docker 搭建多个Linux系统环境 安装多个不同语言的项目

docker 搭建多个Linux系统环境 安装多个不同语言的项目 宝塔dockers可视化界面 https://blog.51cto.com/u_16213709/9473968

xss.pwnfunction-Jefff

在eval中可以直接执行命令所以直接把"直接闭合在结尾再加上一个"因为后面的"没闭和会报错 ?jeffa";alert(1);" 或 ?jeffa"-alert(1)-" -是分隔符

线段树和树状数组

实战演练 1.【模板】树状数【模板】树状数组1 输入&#xff1a; 5 5 1 5 4 2 3 2 2 4 1 2 3 2 2 3 4 1 1 5 1 2 1 4 注意&#xff1a;只修改一个数&#xff08;单点修改&#xff09;&#xff0c;却要输出一个区间的值&#xff08;区间查询&#xff09;&#xff01;&#xff…

SAP操作教程第14期:SAP B1如何进行自定义字段位置设置

服务对于企业而言永远是重中之重&#xff0c;想要提高服务呼叫效率&#xff0c;员工必须能够快速扫描单据和主数据中的重要信息&#xff0c;及时响应客户。那么&#xff0c;拥有适合企业业务流程的表单则是必不可少的前提。 所以&#xff0c;今天我们就来了解一下&#xff0c;在…

数据库连接查询

一、联合查询 1.使用 union 连接两个 select 语句进行联合查询 select 列 1&#xff0c;列 2... from 表名 where 条件 union select 列 1&#xff0c;列 2... from 表名 where 条 件; select vend_id,prod_id,prod_name,prod_price from products where prod_price < 5…