golang對etcd的簡單操作
首先獲取clientv3:
go get go.etcd.io/etcd/clientv3
連線etcd:
config := clientv3.Config{ Endpoints:[]string{"192.168.50.250:2379","172.16.196.129:2379"}, DialTimeout:10*time.Second, } client,err := clientv3.New(config) if err != nil { panic(err) } defer client.Close()
kv := clientv3.NewKV(client)
kv是一個用於操作kv的連線,其實它本質上是用了client的conn,為了更加專注於鍵值對的操作,關閉client後也會使kv無法用。(kv的操作client也能實現)
設定一個超時的context:
ctx,cancleFunc:= context.WithTimeout(context.TODO(),5*time.Second)
context.WithTimeout()會返回一個timerCtx{},並在這個結構體裡注入了超時時間。cancleFunc是一個取消操作的函式。put,get等操作是阻塞型操作,context裡有一個用於管理超時的select,當時間一到就會隱式執行cancelFunc,使操作停止並返回錯誤。如果顯式的呼叫cancelFunc()則會立即停止操作,返回錯誤。
put操作:
putResp,err := kv.Put(ctx,"/job/v3","push the box",clientv3.WithPrevKV())//withPrevKV()是為了獲取操作前已經有的key-value if err != nil{ panic(err) } fmt.Printf("%v",putResp.PrevKv)
getResp,err := kv.Get(ctx,"/job/",clientv3.WithPrefix()) //withPrefix()是未了獲取該key為字首的所有key-value if err != nil{ panic(err) } fmt.Printf("%v",getResp.Kvs)
由於etcd是有序儲存鍵值對的,還可以附加clientv3.WithFromKey(),clientv3.WithLimit()來實現分頁獲取的效果。
監聽etcd叢集鍵的改變:
wc := client.Watch(context.Background(), "/job/", clientv3.WithPrefix(),clientv3.WithPrevKV()) for v := range wc { if v.Err() != nil { panic(err) } for _, e := range v.Events { fmt.Printf("type:%v\n kv:%vprevKey:%v", e.Type, e.Kv, e.PrevKv) } }