etcd中用lease租约实现过期
etcd中用lease租约实现过期。
简单纪录一下在etcd中利用lease实现kv过期的功能。
其实思路很简单:
1.申请一个lease,且给这个租约设置一个ttl,比如设置这个ttl为1秒。
2.然后将这个lease与kv的操作关联起来,那么1s后这个就过期了。
需要注意的是:
1.centos里的端口要放开。
代码如下:
/* author='du' date='2020/5/28 7:17' */ package main import ( "context" "fmt" "github.com/coreos/etcd/clientv3" "time" ) func main() { var ( client *clientv3.Client lease clientv3.Lease leaseGrantResp *clientv3.LeaseGrantResponse leaseId clientv3.LeaseID kv clientv3.KV putResp *clientv3.PutResponse getResp *clientv3.GetResponse ) //客户端配置 config := clientv3.Config{ Endpoints: []string{"129.211.78.6:2379"}, DialTimeout: 5 * time.Second, } //建立连接 client, err := clientv3.New(config) if err != nil { fmt.Printf("连接失败:%s", err) return } //申请一个租约 lease = clientv3.NewLease(client) //申请一个5s的租约。 if leaseGrantResp, err = lease.Grant(context.TODO(), 5); err != nil { fmt.Println(err) return } leaseId = leaseGrantResp.ID //获取kv,然后Put kv,将之和租约关联起来,实现过期的效果 kv = clientv3.KV(client) if putResp, err = kv.Put(context.TODO(), "/cron/lock/job1", "", clientv3.WithLease(leaseId)); err != nil { return } fmt.Println("写入成功,当前revision是:", putResp.Header.Revision) //模拟数据,每1s去get一下数据,看5s后数据有无过期 for { if getResp, err = kv.Get(context.TODO(), "/cron/lock/job1"); err != nil { fmt.Println(err) return } if getResp.Count == 0 { fmt.Println("未获取到数据,已经过期了。") break } fmt.Println("还木有过期,当前数据", getResp.Kvs) time.Sleep(1 * time.Second) } }
由代码,我们可以看到设置了一个5s的ttl,那么看一下效果吧: