go etcdv3 client

396 阅读1分钟

go 访问etcd v3数据库,还是有点坑的。

  • go.mod
replace (
   github.com/coreos/bbolt v1.3.6 => go.etcd.io/bbolt v1.3.6
   google.golang.org/grpc v1.47.0 => google.golang.org/grpc v1.26.0
)

快速开始

  • 简单kv访问示例
package main

import (
   "context"
   "fmt"
   "github.com/coreos/etcd/clientv3"
   "time"
)

func main() {
   fmt.Println("common service registry")
   timeout := 60 * time.Second
   ctx, _ := context.WithTimeout(context.Background(), timeout)
   cli, _ := clientv3.New(clientv3.Config{
      DialTimeout: timeout,
      Endpoints: []string{"192.168.10.8:2379"},
   })
   defer cli.Close()
   kv := clientv3.NewKV(cli)

   pr, _ := kv.Put(ctx, "key", "444")
   fmt.Println(pr.Header.Revision)
}

get with prefix

获取某一前缀的key在命令行中:

etcdctl get node --prefix

API中相对使用clientv3.WithPrefix():

func PrefixGet(cli *clientv3.Client, prefix string) (map[string]string, error) {

	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
        // 相当于--prefix选项
	resp, err := cli.Get(ctx, prefix, clientv3.WithPrefix())
	cancel()
	if err != nil {
		return map[string]string{}, err
	}

        //迭代结果,并以map形式返回
	result := make(map[string]string)
	for _, v := range resp.Kvs {
		result[string(v.Key)] = string(v.Value)
	}

	return result, nil
}