• 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

  • 相关阅读:
    第三章 从网线到网络设备 集线器、交换机、路由器
    914章单机数据库的实现
    图解HTTP全
    【Clickhouse】clickhouse各种模式容器环境搭建
    【Clickhouse】clickhouse 数据类型
    Java NIO 总结
    爬虫文件句柄参考
    Jackson用法大全
    在python中 函数赋值给变量时,需要注意的几个事项
    Python教程:推荐一个比 open 读文件还好用、方便的库
  • 原文地址:https://www.cnblogs.com/binliubiao/p/13492783.html
Copyright © 2020-2023  润新知