etcd套路(六)golang當中操作etcd

huxiaobai_001發表於2020-08-24

前邊我們講了命令列模式下的etcd的操作,今天我們來說一下golang當中歐冠如何去操作etcd,還是那句話不可能總結的那麼全,只是起到一個帶入的作用,遇到了便可深入研究,起碼你得知道有這麼一回事!真正使用到了之後估計你也忘的差不多了,那個時候回頭翻一遍再百度谷歌一下子就解決了,
我們在使用golang操作etcd的時候需要引入包,執行命令:

go get go.etcd.io/etcd/clientv3

如果你的grpc版本太新可能會報錯:

# github.com/coreos/etcd/clientv3/balancer/picker
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\picker\err.go:37:44: undefined: balancer.PickOptions
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\picker\roundrobin_balanced.go:55:54: undefined: balancer.PickOptions
# github.com/coreos/etcd/clientv3/balancer/resolver/endpoint
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\resolver\endpoint\endpoint.go:114:78: undefined: resolver.BuildOption
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\resolver\endpoint\endpoint.go:182:31: undefined: resolver.ResolveNowOption

只需要執行命令:

replace google.golang.org/grpc => google.golang.org/grpc v1.26.0

然後重新go get一下就OK啦!
提供一下解決文件:www.cnblogs.com/wind-zhou/p/128316... (天下文章一大抄抄抄)

我們還是直接看程式碼:

package main

import (
    "context"
    "fmt"
    "go.etcd.io/etcd/clientv3"
    "strconv"
    "time"
)

func main(){
    //服務列表 切片型別
    endpoints := []string{
        "127.0.0.1:2379",
    }
    client3,err := clientv3.New(
        clientv3.Config{
            Endpoints:            endpoints,
            //你還可以設定更過的引數 如果開啟了auth驗證 也可以配置username和password
        },
    )
    // conn fail
    if err != nil {
        panic(err.Error())
    }
    // conn success
    // 第一種:etcdctl put  寫入
    response, err := client3.Put(context.TODO(), "hello", "hushaoliang&hujiacheng")
    if err != nil {
        panic(err.Error())
    }
    fmt.Println(response)

    fmt.Println("=============================================================================================")

    // 第二種:etcdctl get   獲取
    getResponse, err := client3.Get(context.TODO(), "hello")
    if err != nil {
        panic(err.Error())
    }
    for _,kv :=  range getResponse.Kvs {
        fmt.Println(kv)
        fmt.Println(string(kv.Key) + "-------" + string(kv.Value))
    }

    fmt.Println("=============================================================================================")

    // 第三種:etcdctl get --prefix 獲取帶字首的key的值
    getAll, err := client3.Get(context.TODO(), "web", clientv3.WithPrefix())
    if err != nil {
        panic(err.Error())
    }
    for _,kv1 := range getAll.Kvs {
        fmt.Println(kv1)
        fmt.Println(string(kv1.Key) + "--------" + string(kv1.Value))
    }

    fmt.Println("=============================================================================================")

    // 第四種:etcdctl del 刪除元素
    deleteResponse, err := client3.Delete(context.TODO(), "hello")
    if err != nil {
        panic(err.Error())
    }
    fmt.Println(deleteResponse)

    fmt.Println("=============================================================================================")

    // 第五種:etcdctl watch 監控一個key的變化
    //通過channel管道進行的監控 所以無時無刻不在監控 所以呢主程式不會死掉的!
    watch := client3.Watch(context.TODO(), "mine")
    for wc := range watch {
        //讀取watch返回值裡面的事件
        for _,w := range wc.Events {
            fmt.Println(string(w.Kv.Key),string(w.Kv.Value),w.Type.String())
        }
    }

    fmt.Println("=====================程式會卡在這不動 一直監控著watch監控的key值的變化 下邊的測試需要你關閉watch監控哈===========================")

    // 第六種:etcdctl lease grant 100 租賃時長是60s 60s之後就自動過期了!
    grantResponse, err := client3.Grant(context.TODO(), 60)
    if err != nil {
        panic(err.Error())
    }
    if _, err := client3.Put(context.TODO(), "wocao", "nidaye", clientv3.WithLease(grantResponse.ID));err != nil {
        panic(err.Error())
    }
    fmt.Println("ok")
    //測試租賃是否成功  租賃時長是60s 60s之後就自動過期了!
    i := 0
    for {
        ps, err := client3.Get(context.TODO(), "wocao")
        if err != nil {
            panic(err.Error())
        }
        for _,kv := range ps.Kvs {
            fmt.Println(string(kv.Key) + "----" + string(kv.Value))
        }
        i += 5
        fmt.Println(strconv.Itoa(i)+"s")
        time.Sleep(5 * time.Second)
    }

    fmt.Println("=============================================================================================")


}

網上好的總結的文件多的是,比這敲一遍掌握了就是你自己的了,下邊給大家推薦一篇好的博文:zhuanlan.zhihu.com/p/111800017 golang當中操作etcd的詳細案例!

本作品採用《CC 協議》,轉載必須註明作者和本文連結
胡軍

相關文章