go etcd客戶端簡單使用

原文鏈接:https://www.jianshu.com/p/3206e35677b4

轉載自我的飯卡呢的博客

獲取etcd client

首先獲取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()則會立即停止操作,返回錯誤。


etcd鍵值操作

put/get操作:

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:%v  prevKey:%v  ", e.Type, e.Kv, e.PrevKv)
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章