首页
视频
资源
登录
原
Dapr 分布式锁
6369
人阅读
2022/8/12 11:51
总访问:
2602471
评论:
0
收藏:
0
手机
分类:
容器编排
![](https://img.tnblog.net/arcimg/hb/896fd38e95b346f9a0d98c54b135bb94.jpg) >#Dapr 分布式锁 [TOC] ## 分布式锁简介 tn2>简单来讲:两个人做一件事情,同一时间内,我做的时候你不可以做,除非我没有在规定的时间内完成这项任务。 ## 创建分布式锁项目 tn2>首先添加好`Dapr.AspNetCore`包,并在`components`目录下创建`lockstore.yaml`组件,用于添加分布式锁的组件。 ![](https://img.tnblog.net/arcimg/hb/14a4a1ca01394156be4002c0f7fa04ef.png) ```yaml apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: lockstore spec: type: lock.redis metadata: - name: redisHost value: localhost:6379 - name: redisPassword value: "" ``` tn2>然后我们在`Program.cs`中创建分布式锁的代码,代码意思是:添加一个lockstore锁,设置锁定资源的ID为`mylock`,锁的拥有者是`random_id_abc123`,当所在5分钟内没有完成该任务将会自动退出。 拿到锁之后,工作5分钟。 内容如下: ```yaml using Dapr.Client; string DAPR_LOCK_NAME = "lockstore"; var client = new DaprClientBuilder().Build(); var my_file_name = "mylock"; var sleepmin = 5; await using (var fileLock = await client.Lock(DAPR_LOCK_NAME, my_file_name, "random_id_abc123", sleepmin * 60)) { if (fileLock.Success) { Console.WriteLine("Success!"); Thread.Sleep(sleepmin * 60 * 1000); } else { Console.WriteLine($"Failed to lock {my_file_name}."); } Console.WriteLine("Finish!"); } ``` tn2>关于Lock方法中的参数意义如下表所示: ![](https://img.tnblog.net/arcimg/hb/29b0fedf861744c3adfdeb3e25948035.png) | 参数 | 描述 | | ------------ | ------------ | | storeName | 锁名称 | | resourceId | 要锁定的资源的 ID。可以是任何值 | | lockOwner | 锁拥有者的名字。应为每个请求设置一个唯一值 | | expiryInSeconds | 在过期之前持有锁的时间(以秒为单位) | tn2>接下来我们到项目目录中打开两个命令窗口,分别通过如下命令运行dapr。 ```bash dapr run --app-id locker --dapr-grpc-port 50001 --components-path ./components -- dotnet run dapr run --app-id locker --dapr-grpc-port 50002 --components-path ./components -- dotnet run ``` ![](https://img.tnblog.net/arcimg/hb/8777d2b6a143487f97bd63fdf192efce.png) tn2>我们可以清楚的看到第一个窗口锁住了,第二个没有获取到锁。 tn>注意:必须是同一应用。 ## 创建分布式解锁项目 tn2>项目结构如下,只是Program.cs里面变成解锁的代码。 ![](https://img.tnblog.net/arcimg/hb/0d6b39f53a774339a71c944645c7d83c.png) ```csharp using Dapr.Client; string DAPR_LOCK_NAME = "lockstore"; var client = new DaprClientBuilder().Build(); var response = await client.Unlock(DAPR_LOCK_NAME, "mylock", "random_id_abc123"); Console.WriteLine(response.status); ``` tn2>接下来我们通过dapr运行锁的项目。 ```bash dapr run --app-id locker --dapr-grpc-port 50001 --components-path ./components -- dotnet run ``` ![](https://img.tnblog.net/arcimg/hb/de2a69dc1fa943b69687794ee5ece937.png) tn2>此时已经锁住了,然后我们到解锁的项目目录下打开一个命令窗口,执行locker应用的解锁。 ```bash dapr run --app-id locker --dapr-grpc-port 50002 --components-path ./components -- dotnet run ``` ![](https://img.tnblog.net/arcimg/hb/fee6332bdcd14f64a281bd36ce0043cf.png) tn2>然后我们再打开一个新的命令窗口,发现它又可以锁住了。 ```bash dapr run --app-id locker --dapr-grpc-port 50003 --components-path ./components -- dotnet run ``` ![](https://img.tnblog.net/arcimg/hb/a09fa14e424d4a1b8a942b77f78b66c0.png)
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}
尘叶心繁
这一世以无限游戏为使命!
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net后台框架
168篇
linux
17篇
linux中cve
1篇
windows中cve
0篇
资源分享
10篇
Win32
3篇
前端
28篇
传说中的c
4篇
Xamarin
9篇
docker
15篇
容器编排
101篇
grpc
4篇
Go
15篇
yaml模板
1篇
理论
2篇
更多
Sqlserver
4篇
云产品
39篇
git
3篇
Unity
1篇
考证
2篇
RabbitMq
23篇
Harbor
1篇
Ansible
8篇
Jenkins
17篇
Vue
1篇
Ids4
18篇
istio
1篇
架构
2篇
网络
7篇
windbg
4篇
AI
18篇
threejs
2篇
人物
1篇
嵌入式
2篇
python
13篇
HuggingFace
8篇
pytorch
9篇
opencv
6篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术