• 作者:老汪软件技巧
  • 发表时间:2024-10-05 04:00
  • 浏览量:58

etcd介绍

etcd 是一个高可用的分布式键值存储,用于分布式系统中的配置共享和服务发现。它由 CoreOS 开发,目标是提供可靠的数据存储、强一致性以及集群管理功能。etcd 特别适合需要高可用性和一致性要求的分布式系统组件之间的协调与同步。具有一下特性

etcd主要用于分布式系统的协调与管理,想对etcd更多的了解可以访问官网etcd.io/

本文主要讲述golang对etcd的一些基本操作

_强一致性:使用 Raft 算法,确保分布式系统在写操作完成后,所有节点的数据都保持一致_强一致性:使用 Raft 算法,确保分布式系统在写操作完成后,所有节点的数据都保持一致

以下是增删改查的基本操作

package main
import (
	"context"
	"fmt"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
	"github.com/syyongx/php2go"
	clientv3 "go.etcd.io/etcd/client/v3"
	"log"
	"time"
)
func main() {
	// 创建一个连接到 etcd 的客户端
	cli, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{"127.0.0.1:2379"}, // etcd 服务的地址
		DialTimeout: 5 * time.Second,            // 连接超时时间
	})
	if err != nil {
		log.Fatal(err)
		return
	}
	defer cli.Close()
	// 测试连接
	fmt.Println("Successfully connected to etcd!")
	key := "name"
	value := "chen lao fei"
	// 设置值
	SetValue(cli, key, value)
	// 异步监听值的变化
	go Watch(cli, key)
	// 获取值
	GetValue(cli, key)
	php2go.Sleep(5)
	g.Log().Info(gctx.New(), "5后执行设置操作")
	// 执行 一次 更新操作 (5s后)
	SetValue(cli, key, "big pig")
	// 删除值(5s 后)
	php2go.Sleep(5)
	g.Log().Info(gctx.New(), "5后执行删除操作")
	DelValue(cli, key)
	php2go.Sleep(5)
	g.Log().Info(gctx.New(), "5后执行设置操作")
	SetValue(cli, key, "big pig ...... new")
	php2go.Sleep(5)
	g.Log().Info(gctx.New(), "程序结束")
}
// 设置值
func SetValue(cli *clientv3.Client, key, value string) {
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	_, err := cli.Put(ctx, key, value)
	if err != nil {
		log.Fatal(err)
	}
	g.Log().Info(ctx, "已设置")
}
// 获取值
func GetValue(cli *clientv3.Client, key string) {
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	resp, err := cli.Get(ctx, key)
	if err != nil {
		log.Fatal(err)
	}
	for _, ev := range resp.Kvs {
		g.Log().Info(gctx.New(), "读取到的数据")
		fmt.Printf("%s : %s\n", ev.Key, ev.Value)
	}
}
// 删除值
func DelValue(cli *clientv3.Client, key string) {
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	_, err := cli.Delete(ctx, key)
	if err != nil {
		log.Fatal(err)
	}
	g.Log().Info(ctx, "已删除")
}
// 监听变化
func Watch(cli *clientv3.Client, key string) {
	watchChan := cli.Watch(context.Background(), key) // 监听键 "foo"
	for watchResp := range watchChan {
		for _, event := range watchResp.Events {
			g.Dump(event)
			//fmt.Printf("类型: %s 键: %s 值: %s\n", event.Type, event.Kv.Key, event.Kv.Value)
		}
	}
}

执行结果

Successfully connected to etcd!
2024-10-03 19:18:13.371 [INFO] 已设置
2024-10-03 19:18:13.372 [INFO] {5e0d995446edfa17b0734424b0904584} 读取到的数据
name : chen lao fei
2024-10-03 19:18:18.373 [INFO] {f6b7b07e47edfa17b173442475a2d689} 5后执行设置操作
2024-10-03 19:18:18.376 [INFO] 已设置
{
    Type:                 "PUT",
    Kv:                   {
        Key:                  "name",
        CreateRevision:       9,
        ModRevision:          10,
        Version:              2,
        Value:                "big pig",
        Lease:                0,
        XXX_NoUnkeyedLiteral: {},
        XXX_unrecognized:     "",
        XXX_sizecache:        0,
    },
    PrevKv:               nil,
    XXX_NoUnkeyedLiteral: {},
    XXX_unrecognized:     "",
    XXX_sizecache:        0,
}
2024-10-03 19:18:23.377 [INFO] {9710f3a848edfa17b2734424e839d75e} 5后执行删除操作
2024-10-03 19:18:23.379 [INFO] 已删除
{
    Type:                 "DELETE",
    Kv:                   {
        Key:                  "name",
        CreateRevision:       0,
        ModRevision:          11,
        Version:              0,
        Value:                "",
        Lease:                0,
        XXX_NoUnkeyedLiteral: {},
        XXX_unrecognized:     "",
        XXX_sizecache:        0,
    },
    PrevKv:               nil,
    XXX_NoUnkeyedLiteral: {},
    XXX_unrecognized:     "",
    XXX_sizecache:        0,
}
2024-10-03 19:18:28.381 [INFO] {c26c2bd349edfa17b3734424e638a976} 5后执行设置操作
{
    Type:                 "PUT",
    Kv:                   {
        Key:                  "name",
        CreateRevision:       12,
        ModRevision:          12,
        Version:              1,
        Value:                "big pig ...... new",
        Lease:                0,
        XXX_NoUnkeyedLiteral: {},
        XXX_unrecognized:     "",
        XXX_sizecache:        0,
    },
    PrevKv:               nil,
    XXX_NoUnkeyedLiteral: {},
    XXX_unrecognized:     "",
    XXX_sizecache:        0,
}
2024-10-03 19:18:28.385 [INFO] 已设置
2024-10-03 19:18:33.386 [INFO] {898984fd4aedfa17b47344245b96a6aa} 程序结束

从输出面板可以看出来,key(name)被监听后,PUT ,DELETE等操作会触发监听,所以非常适用于配置管理,服务注册与发现等场景


Top