package main import ( "context" "fmt" "go.etcd.io/etcd/client/v3" "time" ) func main() { cli, err := clientv3.New(clientv3.Config{ Endpoints: []string{"192.168.1.7:2379"}, DialTimeout: 5 * time.Second, }) if err != nil { // handle error! fmt.Printf("connect to etcd failed, err:%v\n", err) return } fmt.Println("connect to etcd success") defer cli.Close() // put ctx, cancel := context.WithTimeout(context.Background(), time.Second) _, err = cli.Put(ctx, "name", "shuaimei") cancel() if err != nil { fmt.Printf("put to etcd failed, err:%v\n", err) return } // get ctx, cancel = context.WithTimeout(context.Background(), time.Second) resp, err := cli.Get(ctx, "name") cancel() if err != nil { fmt.Printf("get from etcd failed, err:%v\n", err) return } for _, ev := range resp.Kvs { fmt.Printf("%s:%s\n", ev.Key, ev.Value) } //申请租约 Grant() var leaseGrantResp *clientv3.LeaseGrantResponse lease := clientv3.NewLease(cli) if leaseGrantResp, err = lease.Grant(context.TODO(), 10); err != nil { fmt.Println(err) return } leaseId := leaseGrantResp.ID // 获得kv API子集 kv := clientv3.NewKV(cli) if _, err = kv.Put(context.TODO(), "/school/class/students", "h", clientv3.WithLease(leaseId)); err != nil { fmt.Println(err) return } //for { // var getResp *clientv3.GetResponse // if getResp, err = kv.Get(context.TODO(), "/school/class/students"); err != nil { // fmt.Println(err) // return // } // if getResp.Count == 0 { // fmt.Println("kv过期了") // break // } // fmt.Println("还没过期:", getResp.Kvs) // time.Sleep(2 * time.Second) //} //自动续租 KeepAlive() var keepRespChan <-chan *clientv3.LeaseKeepAliveResponse fmt.Println(leaseId) if keepRespChan, err = lease.KeepAlive(context.TODO(), leaseId); err != nil { fmt.Println(err) return } go func() { for { select { case keepResp := <- keepRespChan: if keepRespChan == nil { fmt.Println("租约已经失效了") goto END } else { // 每秒会续租一次, 所以就会受到一次应答 fmt.Println("收到自动续租应答:", keepResp.ID) } } } END: }() }