etcd获取分布式锁
cli, err := clientv3.New(clientv3.Config{Endpoints: endpoints})
if err != nil {
log.Fatal(err)
}
defer cli.Close()
// create two separate sessions for lock competition
s1, err := concurrency.NewSession(cli, concurrency.WithTTL(10))
if err != nil {
log.Fatal(err)
}
defer s1.Close()
m1 := concurrency.NewMutex(s1, "/my-lock/")
// acquire lock for s1
if err := m1.Lock(context.TODO()); err != nil {
log.Fatal(err)
}
fmt.Println("acquired lock for s1")
if err := m1.Unlock(context.TODO()); err != nil {
log.Fatal(err)
}
fmt.Println("released lock for s1")
1、首先通过 concurrency.NewSession 方法创建 Session,本质是创建了一个 TTL 为 10 的 Lease。
2、其次得到 session 对象后,通过 concurrency.NewMutex 创建了一个 mutex 对象,包含 Lease、key prefix 等信息。
3、然后通过 mutex 对象的 Lock 方法尝试获取锁。
当 CreateRevision 为 0 时,它会创建一个 prefix 为 /my-lock 的 key( /my-lock + LeaseID),并获取到 /my-lock prefix 下面最早创建的一个 key(revision 最小),分布式锁最终是由写入此 key 的 client 获得,其他 client 则进入等待模式。
4、最后使用结束,可通过 mutex 对象的 Unlock 方法释放锁。
大约 2 分钟