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

news2025/1/13 13:49:16

有关包的安装

我们要实现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.coloradmin.cn/o/1623564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Gateway基础知识

文章目录 Spring Cloud GateWay 用法核心概念请求流程两种配置方式设置日志(建议设置)路由的各种断言断言The After Route Predicate FactoryThe Before Route Predicate FactoryThe Between Route Predicate FactoryThe Cookie Route Predicate Factory…

海外盲盒APP开发:探索海外盲盒市场的商机

随着娱乐消费的流行,盲盒在我国可以说是非常火热,消费群体和市场规模逐年增加。在盲盒热潮下,不少潮玩企业也纷纷加入到了盲盒赛道中,市场竞争非常激烈! 此外,我国盲盒出海也成为了一个大趋势。盲盒不仅在…

uni-app canvas 签名

调用方法 import Signature from "/components/signature.vue" const base64Img ref() //监听getSignImg uni.$on(getSignImg, ({ base64, path }) > {base64Img.value base64//console.log(签名base64, path >, base64, path) //拿到的图片数据// 之后取消…

Java程序员必须掌握的数据结构:HashMap

HashMap底层原理实现是每个Java Boy必须掌握的基本技能,HashMap也是业务开发每天都需要遇到的好伙伴。如此基础且核心的底层数据结构,JDK也给其赋予了线程安全的功能类,我们来看看~ 🌱以【面试官面试】形式覆盖Java程序员所需掌握…

使用Kimi快速完成高质量学术论文全流程攻略!

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 目录 01.论文选题(重要指数:★★★★★) 02.摘要(重要指数:★★★★) 03.关键词(重要指数:★★★★) 04.引言(重要指数:★★★★) 05.正文(重要指数:★★★★★) 06.结论(重要指数…

能源监控可视化大屏的价值,不要说没啥用了,容易暴露格局

能源监控可视化大屏具有以下几个方面的价值: 实时监控: 能源监控可视化大屏可以实时展示能源系统的运行状态,包括电力、水、气等能源的消耗、供应情况,以及设备运行状态等。通过实时监控,可以及时发现异常情况和故障…

翻译《The Old New Thing》 - What does SHGFI_USEFILEATTRIBUTES mean?

What does SHGFI_USEFILEATTRIBUTES mean? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20040601-00/?p39073 Raymond Chen 2004年06月01日 在使用 SHGetFileInfo 函数时,你可以设置一个名为 SHGFI_USEFILEATTRIBUTES 的标志…

目标检测——3D玩具数据集

在数字化时代,计算机视觉技术取得了长足的进展,其中基于形状的3D物体识别技术更是引起了广泛关注。该技术不仅有助于提升计算机对现实世界物体的感知能力,还在多个领域展现出了广阔的应用前景。本文将探讨基于形状的3D物体识别实验的重要性意…

WMS之添加View

目录 前言一、addview示例二、addview流程2.1 流程图2.2 流程分析2.2.1 Actitity的启动流程创建PhoneWindow和DecorView2.2.2.WindowManagerImpl 添加view2.2.3 ViewRootImpl.setView 三、总结 前言 WMS 功能繁杂,通过添加View流程进一步分析WMS 通过本文了解掌握…

RPC分布式通信框架

在实际开发中单机服务器存在诸多问题: 1.受限于硬件资源无法提高并发量 2.任意模块的修改都将导致整个项目代码重新编译部署 3.在系统中,有些模块属于CPU密集型,有些属于I/O密集型,各模块对于硬件资源的需求不一样 什么是分布式&a…

程序员转技术管理要做哪些努力?

对许多开发者而言,深耕技术,然后成为技术专家或许是职业发展的唯一答案。但如果你赞同「软件开发只是我众多职业目标中的一个」,也许你可以试试「技术管理之路」。 我原来觉得和计算机打交道比跟人打交道轻松得多,所以我成了一名…

每日OJ题_DFS回溯剪枝①_力扣46. 全排列(回溯算法简介)

目录 回溯算法简介 力扣46. 全排列 解析代码 回溯算法简介 回溯算法是一种经典的递归算法,通常⽤于解决组合问题、排列问题和搜索问题等。 回溯算法的基本思想:从一个初始状态开始,按照⼀定的规则向前搜索,当搜索到某个状态无…

【UnityShader入门精要学习笔记】第十一章 Shader动画

本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更,有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 UnityShad…

Vuforia AR篇(三)— AR模型出场效果

目录 前言一、AR模型出场二、AR出场特效三、添加过渡效果四、效果 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、AR模型出场 创建ARCamer…

上位机图像处理和嵌入式模块部署(树莓派4b之mcu固件升级)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在一个系统当中,可能不止需要树莓派4b一个设备,有的时候还需要搭载一个mcu,做一些运动控制的事情。比如说&…

【ESP32入门实战】初识ESP32

【ESP32入门实战】初识ESP32 文章目录 【ESP32入门实战】初识ESP32👨‍🏫前言【写作缘由】🧑‍🎓ESP32介绍👩‍💻ESP32-WROOM-32👩‍💻ESP32的组成部分 👨‍&#x1f3eb…

Android—统一依赖版本管理

依赖版本管理有多种方式 config.gradle 用于Groovy DSL,新建一个 config.gradle 文件,然后将项目中所有依赖写在里面,更新只需修改 config.gradle文件内容,作用于所有module buildSrc 可用于Kotlin DSL或Groovy DSL,…

48-70V降12V/33V 5A高效同步降压DC-DC——AH1007

AH1007是一款高效率、高压外置MOSFET管降压芯片TEL:186*4884*3702*,芯片典型输入是8V~100V,输出 电压可调,AH1007最大输出电流可支持6A以上,需要注意板子的散热和温升。 AH1007典型开关频率为150KHz。轻载时会自动降低开关频率以…

如何把MP3音频转AAC?超级简单的音频格式转换方法在这里

在数字化时代,音乐文件的格式多种多样,每种格式都有其独特的特点和优势。其中,MP3和AAC是两种非常常见的音频格式。MP3由于其较小的文件大小和良好的音质,在过去几十年中一直备受欢迎。然而,随着技术的进步和音频编码算…

掼蛋游戏中的坏习惯

掼蛋是一款需要团队合作和策略思考的游戏,已经成为很多人的日常休闲娱乐方式。然而在日常掼蛋游戏中,有些玩家可能会做出一些不良举动,影响游戏的进行。我们列举了一些常见的坏习惯,希望玩家能够注意并且避免。 1、随意退出 有些玩…