Golang之ETCD基础使用

389 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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进行键值对设置与获取。

  1. 新增修改键值
etcdctl put my-key "Hello Etcd"
  1. 获取键值
etcdctl get my-key
  1. 删除键值
etcdctl del my-key
  1. 获取指定前缀的键值列表
etcdctl get --prefix /

golang 模块安装

go get go.etcd.io/etcd/client/v3

基于golang 模块的基础使用

  1. 新增、修改键值
// 客户端配置
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)
  1. 获取键值
// 客户端配置
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)
}
  1. 删除键值
// 客户端配置
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)
  1. 获取指定前缀的键值列表
// 客户端配置
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)
}