Dapr 分布式锁 电脑版发表于:2022/8/12 11:51  >#Dapr 分布式锁 [TOC] ## 分布式锁简介 tn2>简单来讲:两个人做一件事情,同一时间内,我做的时候你不可以做,除非我没有在规定的时间内完成这项任务。 ## 创建分布式锁项目 tn2>首先添加好`Dapr.AspNetCore`包,并在`components`目录下创建`lockstore.yaml`组件,用于添加分布式锁的组件。  ```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方法中的参数意义如下表所示:  | 参数 | 描述 | | ------------ | ------------ | | 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 ```  tn2>我们可以清楚的看到第一个窗口锁住了,第二个没有获取到锁。 tn>注意:必须是同一应用。 ## 创建分布式解锁项目 tn2>项目结构如下,只是Program.cs里面变成解锁的代码。  ```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 ```  tn2>此时已经锁住了,然后我们到解锁的项目目录下打开一个命令窗口,执行locker应用的解锁。 ```bash dapr run --app-id locker --dapr-grpc-port 50002 --components-path ./components -- dotnet run ```  tn2>然后我们再打开一个新的命令窗口,发现它又可以锁住了。 ```bash dapr run --app-id locker --dapr-grpc-port 50003 --components-path ./components -- dotnet run ``` 