etcd(读作 et-see-dee)是一种开源的分布式统一键值存储,用于分布式系统或计算机集群的共享配置、服务发现和的调度协调。etcd 有助于促进更加安全的自动更新,协调向主机调度的工作,并帮助设置容器的覆盖网络。
etcd 是许多其他项目的核心组件。最值得注意的是,它是 Kubernetes 的首要数据存储,也是容器编排的实际标准系统。使用 etcd, 云原生应用可以保持更为一致的运行时间,而且在个别服务器发生故障时也能正常工作。应用从 etcd 读取数据并写入到其中;通过分散配置数据,为节点配置提供冗余和弹性。
package main
import (
"context"
"fmt"
"go.etcd.io/etcd/clientv3"
"time"
)
// 代码连接etcd
func main(){
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"127.0.0.1:2379"},
DialTimeout:time.Second*5,
})
if err != nil {
fmt.Printf("---------connect to etcd failed, err:%v", err)
return
}
defer cli.Close()
默认端口2379
// put
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
str := `[{"path":"D:/learn/go/log-collector-lmh/log_agent_etcd/log_file/log1","topic":"log1"},{"path":"D:/learn/go/log-collector-lmh/log_agent_etcd/log_file/log2","topic":"log2"}]`
k:="etcd_collect_key"
_, err = cli.Put(ctx, k, str)
if err != nil {
fmt.Printf("put to etcd failed, err:%v", err)
return
}
cancel()
// get
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
gr, err := cli.Get(ctx, k)
if err != nil {
fmt.Printf("-------get from etcd failed, err:%v", err)
return
}
for _, ev := range gr.Kvs{
fmt.Printf("------key:%s value:%s/n", ev.Key, ev.Value)
}
cancel()
package main
import (
"context"
"fmt"
"go.etcd.io/etcd/clientv3"
"time"
)
// watch
func main(){
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"127.0.0.1:2379"},
DialTimeout:time.Second*5,
})
if err != nil {
fmt.Printf("connect to etcd failed, err:%v", err)
return
}
defer cli.Close()
// watch
watchCh := cli.Watch(context.Background(), "etcd_collect_key")
for wresp := range watchCh{
for _, evt := range wresp.Events{
fmt.Printf("type:%s key:%s value:%s\n", evt.Type, evt.Kv.Key, evt.Kv.Value)
}
}
}
当etcd中的etcd_collect_key
值变化时(修改,删除)时,会监控到。