tnblog
首页
视频
资源
登录

Dapr 分布式锁

7798人阅读 2022/8/12 11:51 总访问:3466985 评论:0 收藏:0 手机
分类: 容器编排

Dapr 分布式锁

分布式锁简介


简单来讲:两个人做一件事情,同一时间内,我做的时候你不可以做,除非我没有在规定的时间内完成这项任务。

创建分布式锁项目


首先添加好Dapr.AspNetCore包,并在components目录下创建lockstore.yaml组件,用于添加分布式锁的组件。

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: lockstore
  5. spec:
  6. type: lock.redis
  7. metadata:
  8. - name: redisHost
  9. value: localhost:6379
  10. - name: redisPassword
  11. value: ""


然后我们在Program.cs中创建分布式锁的代码,代码意思是:添加一个lockstore锁,设置锁定资源的ID为mylock,锁的拥有者是random_id_abc123,当所在5分钟内没有完成该任务将会自动退出。
拿到锁之后,工作5分钟。
内容如下:

  1. using Dapr.Client;
  2. string DAPR_LOCK_NAME = "lockstore";
  3. var client = new DaprClientBuilder().Build();
  4. var my_file_name = "mylock";
  5. var sleepmin = 5;
  6. await using (var fileLock = await client.Lock(DAPR_LOCK_NAME, my_file_name, "random_id_abc123", sleepmin * 60))
  7. {
  8. if (fileLock.Success)
  9. {
  10. Console.WriteLine("Success!");
  11. Thread.Sleep(sleepmin * 60 * 1000);
  12. }
  13. else
  14. {
  15. Console.WriteLine($"Failed to lock {my_file_name}.");
  16. }
  17. Console.WriteLine("Finish!");
  18. }


关于Lock方法中的参数意义如下表所示:

参数 描述
storeName 锁名称
resourceId 要锁定的资源的 ID。可以是任何值
lockOwner 锁拥有者的名字。应为每个请求设置一个唯一值
expiryInSeconds 在过期之前持有锁的时间(以秒为单位)


接下来我们到项目目录中打开两个命令窗口,分别通过如下命令运行dapr。

  1. dapr run --app-id locker --dapr-grpc-port 50001 --components-path ./components -- dotnet run
  2. dapr run --app-id locker --dapr-grpc-port 50002 --components-path ./components -- dotnet run


我们可以清楚的看到第一个窗口锁住了,第二个没有获取到锁。

注意:必须是同一应用。

创建分布式解锁项目


项目结构如下,只是Program.cs里面变成解锁的代码。

  1. using Dapr.Client;
  2. string DAPR_LOCK_NAME = "lockstore";
  3. var client = new DaprClientBuilder().Build();
  4. var response = await client.Unlock(DAPR_LOCK_NAME, "mylock", "random_id_abc123");
  5. Console.WriteLine(response.status);


接下来我们通过dapr运行锁的项目。

  1. dapr run --app-id locker --dapr-grpc-port 50001 --components-path ./components -- dotnet run


此时已经锁住了,然后我们到解锁的项目目录下打开一个命令窗口,执行locker应用的解锁。

  1. dapr run --app-id locker --dapr-grpc-port 50002 --components-path ./components -- dotnet run


然后我们再打开一个新的命令窗口,发现它又可以锁住了。

  1. dapr run --app-id locker --dapr-grpc-port 50003 --components-path ./components -- dotnet run


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Dapr 安装与介绍

Dapr 安装与介绍[TOC] Dapr 介绍Github: https://github.com/dapr/daprDapr是一种可移植的,事件驱动的,无服务器运行时...

Dapr 简单使用的内置API

Dapr 简单使用的内置API[TOC] 您的本地环境具有 Dapr sidecar 二进制文件以及状态管理和消息代理(均使用 Redis)的默认组...

Dapr 定义一个组件

Dapr 定义一个组件[TOC] 在上一步中,您调用了 Dapr HTTP API 来从 Redis 支持的状态存储中存储和检索状态。Dapr通过初始...

Dapr 官方教程第一章(Hello World)

Dapr 官方教程第一章(Hello World)[TOC] 本教程将演示如何在您的机器上本地运行 Dapr。您将部署一个 Node.js 应用程序,该...

Dapr 官方教程第二章(Hello World Kubernetes)

Dapr 官方教程第二章(Hello World Kubernetes)[TOC] 本教程将帮助您在 Kubernetes 集群中使用 Dapr。您将从Hello World部...

Dapr 官方教程第三章(分布式计算器)

Dapr 官方教程第三章(分布式计算器)[TOC] 本快速入门通过分布式计算器展示了 Dapr 的方法调用和状态持久性功能,其中每个...

Dapr 官方教程第四章(发布订阅)

Dapr 官方教程第四章(发布订阅)[TOC] 在本快速入门中,您将创建一个发布者微服务和两个订阅者微服务,以演示 Dapr 如...

Dapr 官方教程第五章(Dapr 绑定kafka)

Dapr 官方教程第五章(Dapr 绑定kafka)[TOC] 在本快速入门中,您将创建两个微服务,一个具有输入绑定,另一个具有输出绑定...

Dapr .netcore与go的方法调用

Dapr .netcore与go的方法调用[TOC] 主要回顾一下dapr是如何调用方法的。这里是通过.netcore程序调用go程序中的方法。本章...

Dapr .NetCore 调用方法

Dapr .NetCore 调用方法[TOC] 创建客户端项目(InvokeMethod) 在Program类中设置日志控制台输出,在 launchSettings.jso...

Dapr .NetCore 状态管理

Dapr .NetCore 状态管理[TOC] 使用状态管理,您的应用程序可以将数据作为键/值对存储在支持的状态存储中。使用状态管理时...

Dapr .NetCore grpc调用

Dapr .NetCore grpc调用[TOC] 本文介绍如何使用 Dapr 连接使用 gRPC 的服务。通过使用 Dapr 的 gRPC 代理功能,您可以使用...

Dapr .NetCore 订阅与发布(上)

Dapr .NetCore 订阅与发布[TOC] 介绍Pub/Sub 是分布式系统中的一种常见模式,具有许多想要利用解耦异步消息传递的服务。使...

Dapr .NetCore 订阅与发布(下)

Dapr .NetCore 订阅与发布(下)[TOC] 解决关于运行是报错问题我们将为InvokeMethodServerAPI项目做一些修改。首先添加一些...

Dapr .NetCore Actor

Dapr .NetCore Actor[TOC] Actor简介简单来讲就是锁的作用,可以用作单线程调用实例,起到加锁的效果。解决了并发抢票的。...

Dapr .NetCore 绑定输入输出

Dapr .NetCore 绑定输入输出[TOC] 输入绑定简单来说通过你的应用所对应的dapr边车绑定队列的消息处理,但是这个消息中间件...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术