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

有关包的安装

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

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

ectd的put与get操作

相关函数说明与示例

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

  • 打开服务端
  • 客户端连接服务端并完成相关操作
    如果不是很清晰的话可以参考博主上一篇博文:
    go语言并发实战——日志收集系统(七) etcd的介绍与简单使用

而现在我们想实现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()
  • 执行相关操作
    Get函数与Put函数的函数签名为:
Put(ctx context.Context, key, val string, opts ...OpOption) (*PutResponse, error)

Get(ctx context.Context, key string, opts ...OpOption) (*GetResponse, error)

我们可以发现它们的参数中存在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
	}

  • 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)
	}

完整代码以及结果示例

  • 完整代码:
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)
	}
}

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

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)
		}
	}

完整代码及示例

代码:

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)
		}
	}
}

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

结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/569494.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI+BI第二弹:QuickBI已支持智能搭建智能问数

缘起:一场主题分享 吴恩达(Andrew Ng)教授,DeepLearning.AI和AI Fund的创始人,在美国红杉资本于2024年3月26日举办的AI Ascent活动中,谈到了人工智能代理工作流程的未来及其潜力,这些工作流程有…

跑腿业务和支付业务的具体实现流程

校园云项目 跑腿业务的具体业务分析 该流程适用于很多接单相关的业务场景,或多或少都可以从中得到启发; 整个流程描述: 任务发布: 用户在平台上发布任务,描述需要完成的任务内容,包括取件地址、送达地址…

typedef 定义函数指针

typdef int(*FUNC_TYPE)(int,int) FUNC_TYPE p NULL; 定义了一个函数指针 函数指针作为函数的参数的用法demon

HarmonyOS开发案例:【音乐播放器】

介绍 使用ArkTS语言实现了一个简易的音乐播放器应用,主要包含以下功能: 播放应用中的音频资源文件,并可进行上一曲、下一曲、播放、暂停、切换播放模式(顺序播放、单曲循环、随机播放)等操作。结合后台任务管理模块&…

python实现钉钉通讯录导出Excel表

Python工具开源专栏 Py0004 python实现钉钉通讯录导出Excel表 Python工具开源专栏前言目录结构部分演示完整代码已在GitHub上开源 前言 需求来源于公司,需要将钉钉通讯录以Excel表的形式导出到本地,方便定期备份。导出的Excel需要处理钉钉用户兼任多部门…

AppleWatch是真的能够减少我iPhone的使用时长

我应该是比较专情的果粉了,我有一台MacBook Pro、iPad Pro、airpods pro 2和iPhone 15 Pro Max。但我还从来没有用过苹果手表。 然后,我就去买了AppleWatchSeries9蜂窝款,并试用了一周,我想知道它是否能帮助我减少使用iPhone的时间…

Sectigo证书申请流程及价格介绍

Sectigo 是一家全球知名的数字证书颁发机构(Certificate Authority, CA),自1998年起就开始提供 SSL 证书服务,是全球最早的 CA 机构之一。 一 Sectigo证书申请流程 1 确定证书类型 根据自身的需求确定证书的类型,一…

源码篇--Nacos服务--中章(5):Nacos客户端启动-实例注册-grpc连接建立

文章目录 前言一、 前奏:二、客户端连接的建立:2.1 NacosNamingService 创建:2.2 NacosNamingService 初始化:2.3 NamingClientProxyDelegate 长连接建立:2.3.1 grpc 代理对象创建:2.3.2 NamingGrpcClientP…

Meta Llama 3本地部署

感谢阅读 环境安装收尾 环境安装 项目文件 下载完后在根目录进入命令终端(windows下cmd、linux下终端、conda的话activate) 运行 pip install -e .不要控制台,因为还要下载模型。这里挂着是节省时间 模型申请链接 复制如图所示的链接 然后…

每周一算法:多起点最短路

题目描述 有一天,琪琪想乘坐公交车去拜访她的一位朋友。由于琪琪非常容易晕车,所以她想尽快到达朋友家。 现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具体分布。 已知城市中共包含 n n n个车站(编号 …

Adobe Firefly Image 3:创新步伐与挑战并存的AI图像生成技术升级

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

编写你的第一个java 程序

1.安装 jdk 网址: Java Downloads | Oracle 一般我们安装jdk 17 就行了 自己练习 自己学习 真正的开发中我们使用jdk 8 这个是最适合开发java 应用程序的 当然你也可以选择你的 系统 来安装这个java 在文件资源管理器打开JDK的安装目录的bin目录,会发…

VSCode通过跳板机免密连接远程服务器的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Android Monkey工具介绍与使用

过于爽快的承认失败,就可能发觉不了曾经与正确非常接近。大家好,依旧是在翻看旧文档的时候,发现一篇关于Monkey的介绍和使用,Monkey这款工具在软件测试中主要用于进行压力测试和稳定性测试。它可以模拟大量随机的用户操作&#xf…

618买什么最划算?618买什么东西便宜?必备数码好物清单分享

​只不,马上又到了618购物节咯,数码产品的优惠力度尤为显著,是购买数码产品的绝佳时机。接下来,我将为大家分享几款性价比超高的数码产品,相信总有一款能吸引你的目光。 一、南卡OE MIX开放式蓝牙耳机 在618购物狂欢节…

javaScript中的闭包

什么是闭包 在理解 JavaScript 中的闭包前先了解以下两个知识点: JavaScript 中的作用域和作用域链JavaScript 中的垃圾回收 简单回顾一下这两个知识点: 1. JavaScript 中的作用域和作用域链 作用域就是一个独立的地盘,让变量不会外泄、…

tomcat 配置支持 ssl 附效果图

1、修改tomcat配置文件server.xml: vim ./conf/server.xml 把配置文件&#xff1a; <Connector port"8088" Server" " protocol"HTTP/1.1"connectionTimeout"20000"redirectPort"8443" URIEncoding"UTF-8" …

C++ | Leetcode C++题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution { public:void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){// 所有数都填完了if (first len) {res.emplace_back(output);return;}for (int i first; i &…

逆数对(树状数组的方法)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 5 4 5 1 3 2 输出 7 思路&#xff1a; 根据题意&#xff0c;求逆序对总数。 逆序对含义&#xff1a;如果数组中的两个不同位置&#xff0c;前面的数字比后面的数字严格大&…

投票刷礼物链接怎么弄?最新投票活动创建系统源码 轻松创建活动

投票刷礼物链接怎么弄&#xff1f;投票活动创建系统的作用和功能多种多样&#xff0c;为用户提供一个便捷、高效且功能强大的平台&#xff0c;用于创建、管理和执行各种投票活动。分享一个最新投票活动创建系统源码&#xff0c;源码开源可二开&#xff0c;含完整代码包和详细搭…
最新文章