go操作etcd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package main

import (
"context"
"crypto/tls"
"crypto/x509"
"fmt"
"io/ioutil"
"log"
"time"

"go.etcd.io/etcd/clientv3"
)

// etcd client put/get demo
// use etcd/clientv3

func main() {
//使用https链接etcd
var etcdCert = "./etcd.pem"
var etcdCertKey = "./etcd-key.pem"
var etcdCa = "./ca.pem"

cert, err := tls.LoadX509KeyPair(etcdCert, etcdCertKey)
if err != nil {
return
}

caData, err := ioutil.ReadFile(etcdCa)
if err != nil {
return
}

pool := x509.NewCertPool()
pool.AppendCertsFromPEM(caData)

_tlsConfig := &tls.Config{
Certificates: []tls.Certificate{cert},
RootCAs: pool,
}
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"https://192.168.7.150:2379"},
DialTimeout: 5 * time.Second,
TLS: _tlsConfig,
})
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, "ropon", "666")
//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, "ropon")
//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)
//}

//// watch key:q1mi change
//rch := cli.Watch(context.Background(), "west") // <-chan WatchResponse
//for wresp := range rch {
// for _, ev := range wresp.Events {
// fmt.Printf("Type: %s Key:%s Value:%s\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
// }
//}

// 创建一个5秒的租约
resp, err := cli.Grant(context.TODO(), 5)
if err != nil {
log.Fatal(err)
}

// 5秒钟之后, /ropon/ 这个key就会被移除
_, err = cli.Put(context.TODO(), "/ropon/", "8888", clientv3.WithLease(resp.ID))
if err != nil {
log.Fatal(err)
}

// the key 'foo' will be kept forever
ch, kaerr := cli.KeepAlive(context.TODO(), resp.ID)
if kaerr != nil {
log.Fatal(kaerr)
}
for {
ka := <-ch
fmt.Println("ttl:", ka.TTL)
}
}