持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
ETCD是分布式的键值存储系统,具有安全性、一致性、响应快速、易于部署等特点,广泛用于服务的注册与发现。本文将从以下几个方面简单介绍ETCD:
-
基于Docker安装ETCD
-
使用命令行操作ETCD
-
Golang 模块安装
-
基于Golang 模块操作ETCD中的数据
官方文档:etcd.io/docs/v3.5/q…
ETCD客户端文档:pkg.go.dev/go.etcd.io/…
安装
基于Docker安装bitnami/etcd
docker run -d --name Etcd-server \
--network app-tier \
--publish 2379:2379 \
--publish 2380:2380 \
--env ALLOW_NONE_AUTHENTICATION=yes \
--env ETCD_ADVERTISE_CLIENT_URLS=http://etcd-server:2379 \
bitnami/etcd:latest
命令行使用
首先通过docker exec -it Etcd-server /bin/bash
进入上面安装的容器内,然后通过etcdctl进行键值对设置与获取。
- 新增修改键值
etcdctl put my-key "Hello Etcd"
- 获取键值
etcdctl get my-key
- 删除键值
etcdctl del my-key
- 获取指定前缀的键值列表
etcdctl get --prefix /
golang 模块安装
go get go.etcd.io/etcd/client/v3
基于golang 模块的基础使用
- 新增、修改键值
// 客户端配置
config := clientv3.Config{
Endpoints: []string{"localhost:2379"}, // 接入点地址
DialTimeout: 5 * time.Second, // 连接超时时长
}
// 建立连接
c, err := clientv3.New(config)
if err != nil {
t.Fatal(err)
}
// 写入数据
p, err := c.Put(context.Background(), "my-key", "Hello World")
if err != nil {
t.Fatal(err)
}
fmt.Println(p)
- 获取键值
// 客户端配置
config := clientv3.Config{
Endpoints: []string{"localhost:2379"}, // 接入点地址
DialTimeout: 5 * time.Second, // 连接过期时长
}
// 建立连接
c, err := clientv3.New(config)
if err != nil {
t.Fatal(err)
}
r, err := c.Get(context.Background(), "my-key")
if err != nil {
t.Fatal(err)
}
for _, v := range r.Kvs {
fmt.Printf("Key:%s Value:%s\n", v.Key, v.Value)
}
- 删除键值
// 客户端配置
config := clientv3.Config{
Endpoints: []string{"localhost:2379"},
DialTimeout: 5 * time.Second,
}
// 建立连接
c, err := clientv3.New(config)
if err != nil {
t.Fatal(err)
}
r, err := c.Delete(context.Background(), "my-key")
if err != nil {
t.Fatal(err)
}
fmt.Println(r)
- 获取指定前缀的键值列表
// 客户端配置
config := clientv3.Config{
Endpoints: []string{"119.27.164.148:2379"},
DialTimeout: 5 * time.Second,
}
// 建立连接
c, _ := clientv3.New(config)
// 在Get方法的最后一个参数中设置clientv3.WithPrefix(),表示查询带有指定前缀的数据
r, err := c.Get(context.Background(), "/key", clientv3.WithPrefix())
if err != nil {
t.Fatal(err)
}
for _, v := range r.Kvs {
fmt.Printf("Key:%s Value:%s\n", v.Key, v.Value)
}