go etcd和ctx

go etcd 用脚本多次设置,无法替换, 设置后无法用 etcdctl.exe get 方法获取,有疑问

package main

import (
	"context"
	"fmt"
	etcd_client "go.etcd.io/etcd/clientv3" // 对于第三方开源组件, 取别名的好处是,以后升级了,直接改导入的包名就行了
	"time"
)

func main() {
	// 初始化一个客户端
	cli, err := etcd_client.New(etcd_client.Config{
		Endpoints:   []string{"localhost:2379"},// 此处可以写多个ip端口
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		fmt.Println("etcd连接失败", err)
		return
	}
	defer cli.Close()
	//ctx 参考这个文档 https://blog-golang.org/context
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)// 设置ctx超时时间
	_, err = cli.Put(ctx, "/logagent/conf/", "sample_value")  // cli设置key,value, ctx是超时控制
	_, err = cli.Put(ctx, "/logagent/conf", "sample_value_asd")  // cli设置key,value, ctx是超时控制
	_, err = cli.Put(ctx, "/logagent/conf/asd2", "sample_value_asd2")  // ctx设置key,value
	cancel()    // 上面的cli.Put操作完成,任务完成了, 就可以把ctx取消掉,释放资源
	if err != nil {
		fmt.Println("etcd设置失败", err)
		return
	}

	ctx, cancel = context.WithTimeout(context.Background(), time.Second)
	resp, err := cli.Get(ctx, "/logagent/conf/")
	cancel()
	if err != nil {
		fmt.Println("获取etcd设置失败")
		return
	}
	for _, v := range resp.Kvs { // resp.Kvs是数组类型的, 因为/logagent/conf/是目录的结构,它的下面可能有很多文件
		fmt.Printf("%s : %s \n", v.Key, v.Value)
	}
}
posted @ 2022-05-14 21:58  ty1539  阅读(93)  评论(0编辑  收藏  举报