GO-操作etcd简单示例

go操作etcd

etcd是使用Go语言开发的一个开源的、高可用的分布式key-value存储系统,可以用于配置共享和服务的注册和发现。

创建测试项目

  • 创建项目go mod init goetcd
  • 下载go依赖库sarama go get go.etcd.io/etcd/clientv3

注意事项

  • 在windows平台上下载安装clientv3出错(因grpc v1.27.0+版本的google.golang.org/grpc包不支持etcdv3引起的)

image-20200812154455151

解决办法修改依赖版本

#修改依赖
go mod edit -require=google.golang.org/grpc@v1.26.0

或在go.mod里加上

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

操作

put和get操作

put命令用来设置键值对数据,get命令用来根据key获取值。

package main

import (
	"context"
	"crypto/tls"
	"crypto/x509"
	"fmt"
	"io/ioutil"
	"time"

	"go.etcd.io/etcd/clientv3"
)

var (
	dialTimeout    = 5 * time.Second
	requestTimeout = 4 * time.Second
	endpoints      = []string{"https://192.168.10.190:2379", "https://192.168.10.191:2379", "https://192.168.10.192:2379"}
	etcdCert       = "etcd.pem"
	etcdCertKey    = "etcd-key.pem"
	etcdCa         = "ca.pem"
)

func main() {
	// 创建连接-TLS
	cert, err := tls.LoadX509KeyPair(etcdCert, etcdCertKey)
	if err != nil {
		fmt.Printf("cert failed, err:%v
", err)
		return
	}
	caData, err := ioutil.ReadFile(etcdCa)
	if err != nil {
		return
	}

	pool := x509.NewCertPool()
	pool.AppendCertsFromPEM(caData)

	_tlsConfig := &tls.Config{
		Certificates: []tls.Certificate{cert},
		RootCAs:      pool,
	}

	cfg := clientv3.Config{
		Endpoints:   endpoints,
		DialTimeout: dialTimeout,
		TLS:         _tlsConfig,
	}

	cli, err := clientv3.New(cfg)

	if err != nil {
		// handle error
		fmt.Printf("connect to etcd failed, err:%v
", err)
		return
	}

	fmt.Println("connect to etcd success")

	defer cli.Close()

	// put
	ctx, cancel := context.WithTimeout(context.Background(), requestTimeout)
	_, err = cli.Put(ctx, "标", "hello")
	cancel()
	if err != nil {
		fmt.Printf("put to etcd failed, err:%v
", err)
		return
	}

	// get
	ctx, cancel = context.WithTimeout(context.Background(), requestTimeout)
	resp, err := cli.Get(ctx, "标")
	cancel()

	if err != nil {
		fmt.Printf("get from etcd failed, err:%v
", err)
		return
	}

	for _, kv := range resp.Kvs {
		fmt.Printf("%s:%s
", kv.Key, kv.Value)
	}
}
  • 运行结果

image-20200812165637979

原文地址:https://www.cnblogs.com/binliubiao/p/13492783.html