#Dapr Actors


文章目录

  • Actors简介以及优势
  • 调用终结点
    • 代码编写
    • 运行与测试
    • Timer和Reminders
    • 启动并测试
  • 总结

提示:以下是本篇文章正文内容,下面案例可供参考

Actors简介以及优势

  • 是一种单线程执行的工作模式

  • 避免代码里显示lock

  • 避免死锁,避免性能问题

  • 使并发编程简单


调用终结点

http://localhost:<dapr-port>/v1.0/actors/<actorType>/<actorId>/
  • <dapr-port>:Dapr正在侦听的HTTP端口
    
  • <actorType>:执行组件类型。
    
  • <actorId>:要调用的特定参与者的ID。
    

代码编写

  1. 新建类库Common,引入Nuget包:
    Dapr.Actors
    Dapr.Actors.AspNetCore

  2. 新建接口IWorkflowActor,写入以下代码:

     public interface IWorkflowActor : IActor{Task<bool> Approve();}
    
  3. BackEnd 引用Common,新建Actors文件夹,定义WorkflowActor,实现IWorkflowActor

      public class WorkflowActor : Actor, IWorkflowActor{public WorkflowActor(ActorHost host) : base(host){}public async Task<bool> Approve(){await StateManager.AddOrUpdateStateAsync(Id.ToString(), "approve", (key, currentStatus) => "approve");return true;}
    }
    
  4. 注册Actors,映射Actors路由

       builder.Services.AddActors(options =>{options.Actors.RegisterActor<WorkflowActor>();});app.MapActorsHandlers();
  5. FrontEnd引入Common,并新建ActorsClientController,添加以下接口

    [HttpGet("{orderId}")]
    public async Task<ActionResult> ApproveAsync(string orderId)
    {var actorId = new ActorId("actorprifix-" + orderId);var proxy = ActorProxy.Create<IWorkflowActor>(actorId, "WorkflowActor");return Ok(await proxy.Approve());
    }
    

运行与测试

  • 启动BackEnd

    dapr run --dapr-http-port 3511 --app-port 5000 --app-id backend dotnet  .\BackEnd\bin\Debug\net6.0\BackEnd.dll --app-ssl
    
  • 启动FrontEnd
    dapr run --dapr-http-port 3501 --app-port 5001  --app-id frontend dotnet  .\FrontEnd\bin\Debug\net6.0\FrontEnd.dll
    

调用API可以看到成功返回true:
http://localhost:5001/api/ActorsClient/123

Redis里面也可以看到状态变为了approve

Timer和Reminders

  • timer和reminder可以设置后台定时触发Actor,两者区别在于,Timer的数据是不会持久化的且只能作用于激活状态的Actor,Reminders则反之。

  • 代码实现

    1. 在IWorkflowActor中声明如下方法

       Task RegisterTimer();Task UnregisterTimer();Task RegisterReminder();Task UnregisterReminder();
      
    2. 在WorkflowActor中继承IRemindable并实现以下方法
      public Task RegisterTimer()
      {var serializedTimerParams = JsonSerializer.SerializeToUtf8Bytes("now is " + DateTime.Now.ToString());//TestTimer 注册进Actor的名称//nameof(this.TimerCallback)  注册进Actor的方法//serializedTimerParams 注册进Actor的方法的参数//TimeSpan.FromSeconds(3) 多长时间后第一次执行//TimeSpan.FromSeconds(3) 间隔多长时间执行return this.RegisterTimerAsync("TestTimer", nameof(this.TimerCallback), serializedTimerParams, TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(3));
      }public async Task TimerCallback(byte[] data)
      {var stateKey = "nowtime";var content = JsonSerializer.Deserialize<string>(data);_logger.LogInformation(" ---------" + content);await this.StateManager.SetStateAsync<string>(stateKey, content);
      }public Task UnregisterTimer()
      {//从Actor中注销return this.UnregisterTimerAsync("TestTimer");
      }public async Task RegisterReminder()
      {await this.RegisterReminderAsync("TestReminder", null, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5));
      }public async Task ReceiveReminderAsync(string reminderName, byte[] state, TimeSpan dueTime, TimeSpan period)
      {var stateKey = "nowtime";var content = "now is " + DateTime.Now.ToString();_logger.LogInformation(" reminder---------" + content);await this.StateManager.SetStateAsync<string>(stateKey, content);
      }public Task UnregisterReminder()
      {return this.UnregisterReminderAsync("TestReminder");
      }
    3. 在ActorsClientController中新增以下接口
      [HttpGet("timer/{orderId}")]
      public async Task<ActionResult> TimerAsync(string orderId)
      {var actorId = new ActorId("actorprifix-" + orderId);var proxy = ActorProxy.Create<IWorkflowActor>(actorId, "WorkflowActor");await proxy.RegisterTimer();return Ok("done");
      }[HttpGet("unregist/timer/{orderId}")]
      public async Task<ActionResult> UnregistTimerAsync(string orderId)
      {var actorId = new ActorId("actorprifix-" + orderId);var proxy = ActorProxy.Create<IWorkflowActor>(actorId, "WorkflowActor");await proxy.UnregisterTimer();return Ok("done");
      }[HttpGet("reminder/{orderId}")]
      public async Task<ActionResult> ReminderAsync(string orderId)
      {var actorId = new ActorId("actorprifix-" + orderId);var proxy = ActorProxy.Create<IWorkflowActor>(actorId, "WorkflowActor");await proxy.RegisterReminder();return Ok("done");
      }[HttpGet("unregist/reminder/{orderId}")]
      public async Task<ActionResult> UnregistReminderAsync(string orderId)
      {var actorId = new ActorId("actorprifix-" + orderId);var proxy = ActorProxy.Create<IWorkflowActor>(actorId, "WorkflowActor");await proxy.UnregisterReminder();return Ok("done");
      }
      

启动并测试

  • 启动BackEnd

    dapr run --dapr-http-port 3511 --app-port 5000 --app-id backend dotnet  .\BackEnd\bin\Debug\net6.0\BackEnd.dll --app-ssl
    
  • 启动FrontEnd
    dapr run --dapr-http-port 3501 --app-port 5001  --app-id frontend dotnet  .\FrontEnd\bin\Debug\net6.0\FrontEnd.dll
    

测试timer:
http://localhost:5001/api/ActorsClient/timer/123

查看Redis中的值:

在此处,我们可以把BackEnd 重启一下,可以发现timer不会触发,也验证了文章开头所说的timer不会持久化

测试reminder:
http://localhost:5001/api/ActorsClient/reminder/123

查看Redis中的值:

在此处,我们同样把BackEnd 重启一下,可以发现reminder还是会触发,验证了reminder会进行数据持久化操作


总结

以上就是这次要给大家分享的内容,本文介绍了Dapr中关于Actors的相关内容,下次将给大家介绍Dapr中的绑定,欢迎各位朋友点赞收藏,同时希望本文能够给大家带来一丝帮助与启发。

Dapr专题之06Actors相关推荐

  1. 精彩回顾 | Dapr闪电说系列

    点击蓝字 关注我们 微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术,将每周三到周六,组织 ...

  2. Dapr闪电说 - Dapr落地云原生架构

    你认识Dapr么?出自微软,面向社区,开源的云原生工具Dapr已经发布多时了,你了解Dapr的相关知识么?无论你是.NET程序员还是Python ,或者Java ,还有Go等都可以用Dapr来完成你的 ...

  3. Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务

    Microsoft .Net Remoting系列专题之二 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...

  4. CS131专题-6:图像特征(Blob检测、LoG算子、Harris-Laplacian)

    本专题介绍的技术应用已不广,但是这些有利于理解SIFT算法的原理,也有助于感悟CV传统技术的发展变迁,以及解决问题的思路. 速记要点: blob是什么:blob是描述图像中局部区域的平均像素强度的特征 ...

  5. CS131专题-4:拟合(最小二乘、RANSAC、霍夫变换)

    本专题目的:了解最小二乘.RANSAC.霍夫变换这3个算法的基本原理,能够做到脱口而出,并从零编程实现. 目录 1 前言 2 最小二乘 2.1 基本原理 2.2 求解方法 3 RANSAC 算法 3. ...

  6. CS131专题-3:图像梯度、边缘检测(sobel、canny等)

    目录 1 前言 2 图像梯度 2.1 梯度公式的离散形式 2.2 图像的梯度表示 2.3 图像梯度的最简单计算方法 2.4 直接应用梯度找图像边缘的问题以及解决方案 3 边缘检测 3.1 好的边缘检测 ...

  7. CS131专题-2:高斯核、噪声、滤波

    目录 1 高斯核 1.1 一维定义 1.2 二维定义 1.2.1 应用高斯核的过程 1.2.2 不同σ值的高斯核情况 1.2.3 不同核宽度情况 1.2.4 高斯核(滤波)特性 1.2.5 使用高斯核 ...

  8. 图的算法专题——最小生成树

    概要: Prim算法 Kruskal算法 1.Prim算法 算法流程: (1)对图G(V,E)设置集合S来存放已被并入的顶点,然后执行n次(2)(3) (2)每次从未并入顶点集合中选择与集合S最近的一 ...

  9. [C#]网络编程系列专题二:HTTP协议详解

    转自:http://www.cnblogs.com/zhili/archive/2012/08/18/2634475.html 我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网 ...

  10. 织梦在哪写html,织梦专题页去.html后缀的方法

    很多人在使用DedeCMS建站的过程中,创建专题页的时候,会发现生成的专题页页面是类似于http://www.xxx.com/zhuanti.html这种,后缀带有.html,这个问题在网上看了不少教 ...

最新文章

  1. 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则
  2. 我所知道的网络管理软件
  3. HALCON基于灰度值的模板匹配
  4. 《Java编程思想》读书笔记 第十三章 字符串
  5. 基于耳-脑电图的脑机接口研究进展
  6. 用Tableau画瓷砖地图
  7. java 绑定微信号开发_Java开发中的常见危险信号
  8. C++的安全类型转换的讨论
  9. 使用FTP获取RFC文档
  10. HTTPS协议的简述
  11. 【转载】Java工程师路线图
  12. Acrobat XI的破解补丁amtlib.dll可能的一些问题
  13. fseek函数、ftell函数和rewind函数
  14. 寻找肇事汽车车牌号C语言,北京交通大学C语言综合程序的设计(黄宇班).doc
  15. 树莓派 kali系统默认密码
  16. Word文档调整字间距的方法教程【收藏】
  17. [深度长文] 996的经济学
  18. 定期报告系统服务器出错 1,做好Web服务器的日常维护必备常识
  19. 大学生的秘密,全都藏在快递里
  20. 高一上册计算机应用基础,计算机应用基础高一期末考试试题及答案

热门文章

  1. Xmarks浏览器书签同步的末日临近
  2. 如何强制App横屏或者竖屏显示应用
  3. setImageResource和setImageDrawable和setImageBitMap区别
  4. 解决用easyboot制作4G以上光盘时,WINPE启动失败的问题
  5. word两种html区别,word文本框有哪两种方式?
  6. Halcon学习之缺陷检测-凸点检测
  7. httpclient简单应用,登录开心网的例子
  8. 20多年老码农的IT学习之路
  9. 如何用java获取网页源代码
  10. 使用geronimo-javamail_1.4发送邮件的有关说明