1. 示例 1
package main
import (
"context"
"fmt"
"go.etcd.io/etcd/clientv3"
"time"
)
// 写入读取
func SetGet() {
// 配置 etcd ,创建客户端
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"127.0.0.1:2379"},
DialTimeout: 5 * time.Second,
})
if err != nil {
fmt.Println("connect failed, err:", err)
return
}
defer cli.Close()
// 存储
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
_, err = cli.Put(ctx, "/sample_key/name/", "sample_value_name")
defer cancel()
if err != nil {
fmt.Println("put name failed, err:", err)
return
}
// 存储
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
_, err = cli.Put(ctx, "/sample_key/name/laixhe", "sample_value_name_laixhe")
defer cancel()
if err != nil {
fmt.Println("put name failed, err:", err)
return
}
// 存储 - 租约时间
del, _:= cli.Grant(context.TODO(), 10) // 申请租约,10s后就会自动移除
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
_, err = cli.Put(ctx, "/sample_key/name/del", "sample_value_name_del", clientv3.WithLease(del.ID))
defer cancel()
if err != nil {
fmt.Println("put name failed, err:", err)
return
}
// 获取
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
resp, err := cli.Get(ctx, "/sample_key/name/")
defer cancel()
if err != nil {
fmt.Println("get failed, err:", err)
return
}
for _, ev := range resp.Kvs {
fmt.Printf("get (/sample_key/name/) %s : %s\n", ev.Key, ev.Value)
}
// 获取前缀的 /sample_key/name/ 都返回
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
resp, err = cli.Get(ctx, "/sample_key/name/", clientv3.WithPrefix())
defer cancel()
if err != nil {
fmt.Println("get failed, err:", err)
return
}
for _, ev := range resp.Kvs {
fmt.Printf("get all (/sample_key/name/) - %s : %s\n", ev.Key, ev.Value)
}
}
2. 示例 2
package main
import (
"context"
"fmt"
"time"
"github.com/coreos/etcd/clientv3"
)
type Etcd struct {
client *clientv3.Client
kv clientv3.KV
lease clientv3.Lease
}
// 全局单例
var (
G_etcd *Etcd
)
// 初始化
func InitEtcd() (err error) {
// 初始化配置
config := clientv3.Config{
Endpoints: []string{"192.168.0.129:2379", "localhost:22379"}, // 集群地址
DialTimeout: time.Duration(5) * time.Millisecond, // 连接超时
}
// 建立连接
client, err := clientv3.New(config)
if err != nil {
fmt.Println(err)
}
// 得到KV和Lease的API子集
kv := clientv3.NewKV(client)
lease := clientv3.NewLease(client)
// 赋值单例
G_etcd = &Etcd{
client: client,
kv: kv,
lease: lease,
}
return
}
func (etcd *Etcd) GetKeyValue(key string) error {
getResp, err := etcd.kv.Get(context.TODO(), key, clientv3.WithPrefix())
if err != nil {
fmt.Println(err)
}
// 遍历所有任务, 进行反序列化
for _, kvPair := range getResp.Kvs {
fmt.Println(kvPair)
}
return err
}
func (etcd *Etcd) PutKeyValue(key, value string) error {
// 保存到etcd
putResp, err := etcd.kv.Put(context.TODO(), key, value, clientv3.WithPrevKV())
if err != nil {
fmt.Println(err)
}
// 如果是更新, 那么返回旧值
if putResp.PrevKv != nil {
fmt.Println(putResp.PrevKv.Value)
}
return err
}
func (etcd *Etcd) DeleteKey(key string) error {
// 从etcd中删除它
delResp, err := etcd.kv.Delete(context.TODO(), key, clientv3.WithPrevKV())
if err != nil {
fmt.Println(err)
}
// 返回被删除的值
if len(delResp.PrevKvs) != 0 {
fmt.Println(delResp.PrevKvs[0].Value)
}
return err
}
func (etcd *Etcd) PutKeyWithLease(key string, timeout int64) (err error) {
leaseGrantResp, err := etcd.lease.Grant(context.TODO(), timeout)
if err != nil {
return
}
// 租约ID
leaseId := leaseGrantResp.ID
_, err = etcd.kv.Put(context.TODO(), key, "", clientv3.WithLease(leaseId))
if err != nil {
return
}
return
}
func main() {
InitEtcd()
G_etcd.PutKeyValue("/demo/A/B", "hello world")
G_etcd.GetKeyValue("/demo/A/B")
G_etcd.DeleteKey("/demo/A/B")
G_etcd.PutKeyWithLease("/demo/A/B", 100)
}
参考:
https://blog.csdn.net/c_circle/article/details/98473421
https://www.jianshu.com/p/3206e35677b4
https://www.cnblogs.com/sunlong88/p/11295424.html
https://segmentfault.com/a/1190000020868242?utm_source=tag-newest
https://gitbook.cn/books/5e7637996ba17a6d2c9a3352/index.html