• go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控


    有关包的安装

    我们要实现go语言对第三方包的操作需要我们下载第三方包go.etcd.io,下载命令:

    go get go.etcd.io/etcd/client/v3 
    
    • 1

    ectd的put与get操作

    相关函数说明与示例

    我们想实现对etcd进行简单的操作的步骤还是比较简单的,在我上一篇文章中,我们基于命令行实现了客户端对服务端的的put/get操作,步骤主要是以下两步:

    而现在我们想实现go语言操作etcd完成get/put操作其实主要也是和商户步骤基本一致:

    • 初始化客户端连接服务端:
    cli, err := clientv3.New(clientv3.Config{
    		Endpoints:   []string{"127.0.0.1:2379"}, //服务端通信端口
    		DialTimeout: 5 * time.Second,            //连接超时时间
    	})
    	if err != nil {
    		fmt.Println("init client failed,err:%v", err)
    		return
    	}
    	fmt.Println("init client success!")
    	defer cli.Close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 执行相关操作
      Get函数与Put函数的函数签名为:
    Put(ctx context.Context, key, val string, opts ...OpOption) (*PutResponse, error)
    
    Get(ctx context.Context, key string, opts ...OpOption) (*GetResponse, error)
    
    • 1
    • 2
    • 3

    我们可以发现它们的参数中存在Context上下文,如果不清楚的话可以参考博主之前的博文:
    go语言并发编程(五) ——Context

    所以我们可以这样实现get/put操作:

    • get操作:
    	//put
    	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    	_, err = cli.Put(ctx, "me", "fengxu")
    	cancel()
    	if err != nil {
    		fmt.Println("put failed,err:%v", err)
    		return
    	}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • put操作:
    //get
    	ctx, cancel = context.WithTimeout(context.Background(), time.Second)
    	res, err := cli.Get(ctx, "me")
    	cancel()
    	if err != nil {
    		fmt.Println("get failed,err:%v", err)
    		return
    	}
    	for _, ev := range res.Kvs {
    		fmt.Printf("%s:%s\n", ev.Key, ev.Value)
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    完整代码以及结果示例

    • 完整代码:
    package main
    
    import (
    	"context"
    	"fmt"
    	clientv3 "go.etcd.io/etcd/client/v3"
    	"time"
    )
    
    func main() {
    	cli, err := clientv3.New(clientv3.Config{
    		Endpoints:   []string{"127.0.0.1:2379"}, //服务端通信端口
    		DialTimeout: 5 * time.Second,            //连接超时时间
    	})
    	if err != nil {
    		fmt.Println("init client failed,err:%v", err)
    		return
    	}
    	fmt.Println("init client success!")
    	defer cli.Close()
    
    	//put
    	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    	_, err = cli.Put(ctx, "me", "fengxu")
    	cancel()
    	if err != nil {
    		fmt.Println("put failed,err:%v", err)
    		return
    	}
    
    	//get
    	ctx, cancel = context.WithTimeout(context.Background(), time.Second)
    	res, err := cli.Get(ctx, "me")
    	cancel()
    	if err != nil {
    		fmt.Println("get failed,err:%v", err)
    		return
    	}
    	for _, ev := range res.Kvs {
    		fmt.Printf("%s:%s\n", ev.Key, ev.Value)
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    我们打开服务端,运行代码结果为:
    在这里插入图片描述

    etcd的watch操作

    watch操作的作用

    在etcd中,watch操作可以让我们实时完成对键值操作的实时监控。

    watch操作函数的实现

    	rch := cli.Watch(context.Background(), "me")
    	for wresp := range rch {
    		for _, ev := range wresp.Events {
    			fmt.Printf("Type:%s Key:%s Value:%s\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    完整代码及示例

    代码:

    package main
    
    import (
    	"context"
    	"fmt"
    	clientv3 "go.etcd.io/etcd/client/v3"
    	"time"
    )
    
    func main() {
    	cli, err := clientv3.New(clientv3.Config{
    		Endpoints:   []string{"127.0.0.1:2379"}, //服务端通信端口
    		DialTimeout: 5 * time.Second,            //连接超时时间
    	})
    	if err != nil {
    		fmt.Println("init client failed,err:%v", err)
    		return
    	}
    	fmt.Println("init client success!")
    	defer cli.Close()
    
    	rch := cli.Watch(context.Background(), "me")
    	for wresp := range rch {
    		for _, ev := range wresp.Events {
    			fmt.Printf("Type:%s Key:%s Value:%s\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
    		}
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    我们运行该程序,尝试在命令行打开客户端对键值对进行操作:
    在这里插入图片描述
    运行结果为:
    在这里插入图片描述
    这样我们就成功实现了watch操作了!

    结语

    我们有关go简单操作etcd到此为止了,后面就是介绍如何在日志收集服务中使用了,我们下篇见!

  • 相关阅读:
    网页设计大作业模板-网页设计大作业(文房四宝 5页)-实训素材
    苹果手机(iPhone)系统升级到IOS16.1后,发现连接WiFi、热点总是经常自动(随机)断开
    AR 和 VR 的开源平台
    Mybatis01、Mybatis简介
    Long类型雪花算法ID返回前端后三位精度缺失问题解决
    大桌子系统升级
    自己动手写乞丐版线程池
    GoogleNet论文精读
    WPF 【十月的寒流】学习笔记(2):MVVM中是怎么实现通知的
    计算机组成原理_指令
  • 原文地址:https://blog.csdn.net/qq_73924465/article/details/138151086