main.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "go.etcd.io/etcd/client/v3"
  6. "time"
  7. )
  8. func main() {
  9. cli, err := clientv3.New(clientv3.Config{
  10. Endpoints: []string{"192.168.1.7:2379"},
  11. DialTimeout: 5 * time.Second,
  12. })
  13. if err != nil {
  14. // handle error!
  15. fmt.Printf("connect to etcd failed, err:%v\n", err)
  16. return
  17. }
  18. fmt.Println("connect to etcd success")
  19. defer cli.Close()
  20. // put
  21. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  22. _, err = cli.Put(ctx, "name", "shuaimei")
  23. cancel()
  24. if err != nil {
  25. fmt.Printf("put to etcd failed, err:%v\n", err)
  26. return
  27. }
  28. // get
  29. ctx, cancel = context.WithTimeout(context.Background(), time.Second)
  30. resp, err := cli.Get(ctx, "name")
  31. cancel()
  32. if err != nil {
  33. fmt.Printf("get from etcd failed, err:%v\n", err)
  34. return
  35. }
  36. for _, ev := range resp.Kvs {
  37. fmt.Printf("%s:%s\n", ev.Key, ev.Value)
  38. }
  39. //申请租约 Grant()
  40. var leaseGrantResp *clientv3.LeaseGrantResponse
  41. lease := clientv3.NewLease(cli)
  42. if leaseGrantResp, err = lease.Grant(context.TODO(), 10); err != nil {
  43. fmt.Println(err)
  44. return
  45. }
  46. leaseId := leaseGrantResp.ID
  47. // 获得kv API子集
  48. kv := clientv3.NewKV(cli)
  49. if _, err = kv.Put(context.TODO(), "/school/class/students", "h", clientv3.WithLease(leaseId)); err != nil {
  50. fmt.Println(err)
  51. return
  52. }
  53. //for {
  54. // var getResp *clientv3.GetResponse
  55. // if getResp, err = kv.Get(context.TODO(), "/school/class/students"); err != nil {
  56. // fmt.Println(err)
  57. // return
  58. // }
  59. // if getResp.Count == 0 {
  60. // fmt.Println("kv过期了")
  61. // break
  62. // }
  63. // fmt.Println("还没过期:", getResp.Kvs)
  64. // time.Sleep(2 * time.Second)
  65. //}
  66. //自动续租 KeepAlive()
  67. var keepRespChan <-chan *clientv3.LeaseKeepAliveResponse
  68. fmt.Println(leaseId)
  69. if keepRespChan, err = lease.KeepAlive(context.TODO(), leaseId); err != nil {
  70. fmt.Println(err)
  71. return
  72. }
  73. go func() {
  74. for {
  75. select {
  76. case keepResp := <- keepRespChan:
  77. if keepRespChan == nil {
  78. fmt.Println("租约已经失效了")
  79. goto END
  80. } else { // 每秒会续租一次, 所以就会受到一次应答
  81. fmt.Println("收到自动续租应答:", keepResp.ID)
  82. }
  83. }
  84. }
  85. END:
  86. }()
  87. }