以下是一个基于 etcd 的分布式锁的完整 Go 代码实现,包含锁的获取、自动续租、释放锁等核心功能,并附有详细注释和注意事项。
完整代码实现
go
复制
package main import ( "context" "fmt" "log" "time" "go.etcd.io/etcd/client/v3" ) // EtcdLock 基于 etcd 的分布式锁 type EtcdLock struct { client *clientv3.Client // etcd 客户端 leaseID clientv3.LeaseID // 租约 ID key string // 锁的键名 cancelFunc context.CancelFunc // 用于取消续租协程 } // NewEtcdLock 创建分布式锁实例 func NewEtcdLock(client *clientv3.Client, key string) *EtcdLock { return &EtcdLock{ client: client, key: key, } } // Lock 尝试获取锁 // ttl: 锁的存活时间(秒) func (l *EtcdLock) Lock(ttl int64) error { // 1. 创建租约 lease := clientv3.NewLease(l.client) leaseResp, err := lease.Grant(context.Background(), ttl) if err != nil { return fmt.Errorf("创建租约失败: %v", err) } l.leaseID = leaseResp.ID // 2. 自动续租(防止任务未完成锁已过期) ctx, cancel := context.WithCancel(context.Background()) l.cancelFunc = cancel keepAl