当前位置: 首页 > article >正文

etcd快速入门

        ETCD(全称“etc daemon”)是一个分布式键值存储,常用于配置管理、服务发现和领导者选举,特别在云原生应用中使用广泛。它使用Raft一致性算法确保分布式系统的一致性。ETCD通过提供API存储、检索和监视键值对的变化,广泛应用于Kubernetes等容器化平台,具有高可靠性、可扩展性和容错性。

        1. 键值存储:

client, err := clientv3.New(clientv3.Config{
    Endpoints: []string{"localhost:2379"},
})
if err != nil {
    log.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// 设置键值对
_, err = client.Put(ctx, "foo", "bar")
if err != nil {
    log.Fatal(err)
}

// 获取键值对
resp, err := client.Get(ctx, "foo")
if err != nil {
    log.Fatal(err)
}
fmt.Println(resp.Kvs)

2. 事务支持:

txn := client.Txn(ctx)
resp := txn.If(
    clientv3.Compare(clientv3.Version("foo"), "=", 0),
).Then(
    clientv3.OpPut("foo", "bar"),
).Else(
    clientv3.OpGet("foo"),
)
txnResp, err := resp.Commit()
if err != nil {
    log.Fatal(err)
}
fmt.Println(txnResp)

3. 监控与通知:

watchChan := client.Watch(context.Background(), "foo")
for wresp := range watchChan {
    for _, ev := range wresp.Events {
        fmt.Printf("Type: %s Key: %s Value: %s\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
    }
}

4. 分布式锁:

leaseResp, err := client.Grant(context.Background(), 10) // 10 seconds lease
if err != nil {
    log.Fatal(err)
}

lock := clientv3.NewMutex(client, "lock-key")
if err := lock.Lock(context.Background()); err != nil {
    log.Fatal(err)
}
fmt.Println("Lock acquired")

// Do work
time.Sleep(5 * time.Second)

if err := lock.Unlock(context.Background()); err != nil {
    log.Fatal(err)
}
fmt.Println("Lock released")

完整demo:

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"go.etcd.io/etcd/client/v3"
)

func main() {
	// 创建 etcd 客户端
	client, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{"localhost:2379"},
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		log.Fatal(err)
	}
	defer client.Close()

	// 将一个键值对存储到 etcd 中
	_, err = client.Put(context.Background(), "foo", "bar")
	if err != nil {
		log.Fatal(err)
	}

	// 从 etcd 中获取值
	resp, err := client.Get(context.Background(), "foo")
	if err != nil {
		log.Fatal(err)
	}

	// 输出键值对
	for _, kv := range resp.Kvs {
		fmt.Printf("%s : %s\n", kv.Key, kv.Value)
	}
}


http://www.kler.cn/a/410899.html

相关文章:

  • 基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功
  • 递推进阶与入门递归
  • SAP_MM/CO模块-超详细的CK11N/CK40N取值逻辑梳理(十几种业务场景,1.76W字)
  • Java基础-Java多线程机制
  • 标贝科技大模型声音复刻 快速获取高品质专属AI声音
  • SQL注入--文件读写注入--理论
  • 业务架构、数据架构、应用架构和技术架构
  • Ubuntu 关闭内核自动更新
  • 因泰立科技:激光技术融合,高速公路治超系统的创新实践
  • C++【日志模块中的writer类】前文中 循环队列用法
  • 2024算法基础公选课练习四(综合2)
  • Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
  • windows下安装wsl的ubuntu,同时配置深度学习环境
  • 小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译
  • 解决单元测试时找不到类名
  • 梧桐数据库的高效索引技术研究及实现
  • 如何修复WordPress .htaccess文件
  • c++中set容器的遍历和读取某一位置的值
  • Web安全之XSS攻击的防范
  • 2024“龙信杯“电子数据取证竞赛-服务器取证题目Writeup
  • Docker pull镜像拉取失败
  • Jira关键git
  • 安卓动态添加View
  • (原件word)项目运维方案,软件运维资料文档,运维总体方案,实施运维资料合集
  • wordpress中Gravatar用户头像不显示,免插件实现添加自定义设置上传头像功能
  • MTK主板_安卓主板方案_MTK联发科主板定制开发