【ETCD】【实操篇(六)】使用多种方式从ETCD集群中读取数据【Get keys by prefix】
本文将演示从 etcd 集群中获取以特定前缀(如 /config/db)开头的所有键值对。
在分布式系统中,etcd
是一个高可用的键值存储,用于存储和共享配置信息、服务发现、协调等。从 etcd
读取数据可以通过多种方式进行,常见的方式是使用 etcd
提供的 HTTP API 或者通过客户端库来进行操作。
目录
- 一、使用EtcdCtl工具来读取数据
- 1.1、设置环境变量(可选)
- 1.2、使用etcdctl Get keys by prefix
- 1.2'、格式化获取的结果
- 1.3、通过etcdctl get -h来查看相关帮助信息
- 二、使用go 客户端读取数据
- 2.1、安装 Go 客户端库
- 2.2、示例代码
- 三、使用Java客户端读取数据
- 3.1、添加pom依赖
- 3.2、写入数据示例代码
- 四、 总结
一、使用EtcdCtl工具来读取数据
1.1、设置环境变量(可选)
export ETCDCTL_API=3
export ETCDCTL_ENDPOINTS=http://localhost:2379
1.2、使用etcdctl Get keys by prefix
etcdctl get <key> <value> --prefix
etcdctl get /config/db --prefix
1.2’、格式化获取的结果
D:\data>etcdctl get /config/db-w json --prefix
{"header":{"cluster_id":1090313446326588887,"member_id":2759271418354571410,"revision":4,"raft_term":2},"kvs":[{"key":"L2NvbmZpZy9kYi9ob3N0","create_revision":4,"mod_revision":4,"version":1,"value":"MTkyLjE2OC4xLjEwMA=="}],"count":1}
上面的示例我们把获取到结果以json形式进行输出
1.3、通过etcdctl get -h来查看相关帮助信息
D:\data>etcdctl get -h
NAME:
get - Gets the key or a range of keys
USAGE:
etcdctl get [options] <key> [range_end] [flags]
OPTIONS:
--consistency="l" Linearizable(l) or Serializable(s)
--count-only[=false] Get only the count
--from-key[=false] Get keys that are greater than or equal to the given key using byte compare
-h, --help[=false] help for get
--keys-only[=false] Get only the keys
--limit=0 Maximum number of results
--order="" Order of results; ASCEND or DESCEND (ASCEND by default)
--prefix[=false] Get keys with matching prefix
--print-value-only[=false] Only write values when using the "simple" output format
--rev=0 Specify the kv revision
--sort-by="" Sort target; CREATE, KEY, MODIFY, VALUE, or VERSION
二、使用go 客户端读取数据
2.1、安装 Go 客户端库
2.2、示例代码
func init() {
// 初始化etcd客户端
var err error
cli, err = clientv3.New(clientv3.Config{
Endpoints: []string{"127.0.0.1:2379"}, // 替换为你的etcd集群地址
DialTimeout: 5 * time.Second,
})
if err != nil {
log.Fatal(err)
}
}
// getValueByPrefix 获取以key开头的数据
func getValueByPrefix(key string) {
response, err := cli.Get(context.Background(), key, clientv3.WithPrefix())
if err != nil {
log.Fatal(err)
}
log.Printf("get value by prefix data success,response header is:%s", response.Header.String())
for _, kv := range response.Kvs {
log.Printf("k:%s,value:%s,version:%s", string(kv.Key), string(kv.Value), kv.Version)
}
}
func main() {
defer cli.Close()
String key = "/config/db";
getValueByPrefix(key)
}
三、使用Java客户端读取数据
3.1、添加pom依赖
<!-- https://mvnrepository.com/artifact/com.ibm.etcd/etcd-java -->
<dependency>
<groupId>com.ibm.etcd</groupId>
<artifactId>etcd-java</artifactId>
<version>0.0.24</version>
</dependency>
3.2、写入数据示例代码
KvStoreClient client = EtcdClient.forEndpoint("localhost", 2379).withPlainText().build();
KvClient kvClient = client.getKvClient();
LeaseClient leaseClient = client.getLeaseClient();
LockClient lockClient = client.getLockClient();
// 写入数据
String key = "/config/db";
RangeResponse rangeResponse = kvClient.get(ByteString.copyFrom(key, StandardCharsets.UTF_8)).asPrefix.sync();
System.out.println(rangeResponse);
四、 总结
本文演示三种通过三种不同方式来从ETCD读取数据的操作,即分别演示了使用etcdCtl工具、Go客户端以及Java客户端读取以/config/db开头的所有key的值。