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
}