zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    爸爸妈妈儿子女儿吃水果问题以及五个哲学家吃饭问题
    同步与互斥中的购票和退票问题的PV操作与实现
    创建react&ts&antd项目
    在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”的解决方案
    aws rds 储存空间占用 异常排查 存储空间占满
    Linux下clang、gcc、intel编译器最新版本安装笔记
    extern "C"与extern "C" { … }的差别
    gcc预处理指令之#pragma once
    指向类的成员变量的指针
    Java程序中使用SQLite总结
  • 原文地址:https://www.cnblogs.com/binliubiao/p/13492783.html
Copyright © 2011-2022 走看看