Dapr专题之06Actors
#Dapr Actors
文章目录
- Actors简介以及优势
- 调用终结点
- 代码编写
- 运行与测试
- Timer和Reminders
- 启动并测试
- 总结
提示:以下是本篇文章正文内容,下面案例可供参考
Actors简介以及优势
是一种单线程执行的工作模式
避免代码里显示lock
避免死锁,避免性能问题
使并发编程简单
调用终结点
http://localhost:<dapr-port>/v1.0/actors/<actorType>/<actorId>/
<dapr-port>:Dapr正在侦听的HTTP端口
<actorType>:执行组件类型。
<actorId>:要调用的特定参与者的ID。
代码编写
新建类库Common,引入Nuget包:
Dapr.Actors
Dapr.Actors.AspNetCore新建接口IWorkflowActor,写入以下代码:
public interface IWorkflowActor : IActor{Task<bool> Approve();}
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;} }
注册Actors,映射Actors路由
builder.Services.AddActors(options =>{options.Actors.RegisterActor<WorkflowActor>();});app.MapActorsHandlers();
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则反之。
代码实现
- 在IWorkflowActor中声明如下方法
Task RegisterTimer();Task UnregisterTimer();Task RegisterReminder();Task UnregisterReminder();
- 在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"); }
- 在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"); }
- 在IWorkflowActor中声明如下方法
启动并测试
- 启动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相关推荐
- 精彩回顾 | Dapr闪电说系列
点击蓝字 关注我们 微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术,将每周三到周六,组织 ...
- Dapr闪电说 - Dapr落地云原生架构
你认识Dapr么?出自微软,面向社区,开源的云原生工具Dapr已经发布多时了,你了解Dapr的相关知识么?无论你是.NET程序员还是Python ,或者Java ,还有Go等都可以用Dapr来完成你的 ...
- Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务
Microsoft .Net Remoting系列专题之二 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...
- CS131专题-6:图像特征(Blob检测、LoG算子、Harris-Laplacian)
本专题介绍的技术应用已不广,但是这些有利于理解SIFT算法的原理,也有助于感悟CV传统技术的发展变迁,以及解决问题的思路. 速记要点: blob是什么:blob是描述图像中局部区域的平均像素强度的特征 ...
- CS131专题-4:拟合(最小二乘、RANSAC、霍夫变换)
本专题目的:了解最小二乘.RANSAC.霍夫变换这3个算法的基本原理,能够做到脱口而出,并从零编程实现. 目录 1 前言 2 最小二乘 2.1 基本原理 2.2 求解方法 3 RANSAC 算法 3. ...
- CS131专题-3:图像梯度、边缘检测(sobel、canny等)
目录 1 前言 2 图像梯度 2.1 梯度公式的离散形式 2.2 图像的梯度表示 2.3 图像梯度的最简单计算方法 2.4 直接应用梯度找图像边缘的问题以及解决方案 3 边缘检测 3.1 好的边缘检测 ...
- CS131专题-2:高斯核、噪声、滤波
目录 1 高斯核 1.1 一维定义 1.2 二维定义 1.2.1 应用高斯核的过程 1.2.2 不同σ值的高斯核情况 1.2.3 不同核宽度情况 1.2.4 高斯核(滤波)特性 1.2.5 使用高斯核 ...
- 图的算法专题——最小生成树
概要: Prim算法 Kruskal算法 1.Prim算法 算法流程: (1)对图G(V,E)设置集合S来存放已被并入的顶点,然后执行n次(2)(3) (2)每次从未并入顶点集合中选择与集合S最近的一 ...
- [C#]网络编程系列专题二:HTTP协议详解
转自:http://www.cnblogs.com/zhili/archive/2012/08/18/2634475.html 我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网 ...
- 织梦在哪写html,织梦专题页去.html后缀的方法
很多人在使用DedeCMS建站的过程中,创建专题页的时候,会发现生成的专题页页面是类似于http://www.xxx.com/zhuanti.html这种,后缀带有.html,这个问题在网上看了不少教 ...
最新文章
- 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则
- 我所知道的网络管理软件
- HALCON基于灰度值的模板匹配
- 《Java编程思想》读书笔记 第十三章 字符串
- 基于耳-脑电图的脑机接口研究进展
- 用Tableau画瓷砖地图
- java 绑定微信号开发_Java开发中的常见危险信号
- C++的安全类型转换的讨论
- 使用FTP获取RFC文档
- HTTPS协议的简述
- 【转载】Java工程师路线图
- Acrobat XI的破解补丁amtlib.dll可能的一些问题
- fseek函数、ftell函数和rewind函数
- 寻找肇事汽车车牌号C语言,北京交通大学C语言综合程序的设计(黄宇班).doc
- 树莓派 kali系统默认密码
- Word文档调整字间距的方法教程【收藏】
- [深度长文] 996的经济学
- 定期报告系统服务器出错 1,做好Web服务器的日常维护必备常识
- 大学生的秘密,全都藏在快递里
- 高一上册计算机应用基础,计算机应用基础高一期末考试试题及答案