// Package etcd ... // // Description : 租约相关操作 // // Author : go_developer@163.com<白茶清欢> // // Date : 2021-11-23 6:03 下午 package etcd import ( "context" "github.com/pkg/errors" "go.etcd.io/etcd/clientv3" ) // LeaseOnce 申请一个一次性租约 // // Author : go_developer@163.com<白茶清欢> // // Date : 6:06 下午 2021/11/23 func LeaseOnce(ctx context.Context, key string, val string, ttl int64) error { if ttl <= 0 { return errors.New("lease time must be more than 0") } if nil == ctx { ctx = context.TODO() } var ( resp *clientv3.LeaseGrantResponse err error ) // 创建一个5秒的租约 if resp, err = Client.Grant(ctx, ttl); err != nil { return errors.New("lease grant error : " + err.Error()) } // ttl 秒钟之后, 这个key就会被移除 if _, err = Client.Put(context.TODO(), key, val, clientv3.WithLease(resp.ID)); err != nil { return errors.New("lease key put fail : " + err.Error()) } return nil } // LeaseKeepAliveForever 无限续租一个key // // Author : go_developer@163.com<白茶清欢> // // Date : 7:40 下午 2021/11/23 func LeaseKeepAliveForever(ctx context.Context, key string, val string, ttl int64, keepAliveHandler LeaseKeepALiveHandler) error { if ttl <= 0 { return errors.New("lease time must be more than 0") } if nil == ctx { ctx = context.TODO() } var ( resp *clientv3.LeaseGrantResponse respChan <-chan *clientv3.LeaseKeepAliveResponse err error ) // 创建一个5秒的租约 if resp, err = Client.Grant(ctx, ttl); err != nil { return errors.New("lease grant error : " + err.Error()) } // ttl 秒钟之后, 这个key就会被移除 if _, err = Client.Put(context.TODO(), key, val, clientv3.WithLease(resp.ID)); err != nil { return errors.New("lease key put fail : " + err.Error()) } // the key will be kept forever if respChan, err = Client.KeepAlive(ctx, resp.ID); nil != err { return errors.New("lease keep alive fail : " + err.Error()) } // 监听 chan for ka := range respChan { if nil != keepAliveHandler { keepAliveHandler(key, ka) } } return nil }