一架梯子,一头程序猿,仰望星空!

Java etcd基本操作


etcd是一个键值存储系统,类似ZooKeeper, key是以目录结构形式组织的,如下:

key的命名例子:

/tizi365
/tizi365/site/name
/tizi365/site/domain
/tizi365/status/urls

key以这种目录树结构方式存储,etcd支持前缀搜索,例如:搜索key 以 /tizi365 为前缀的所有键值,下面介绍java对etcd的基本操作。

说明:因为etcd的Key和value都以字节类型进行存储,所以jetcd包为我们提供了ByteSequence类,用于转换key/value的值。

1.写入数据

// 连接etcd
Client client = Client.builder().endpoints("http://localhost:2379").build();
// 获取KV client
KV kvClient = client.getKVClient();

// 设置Key = "/tizi"
ByteSequence key = ByteSequence.from(new String("/tizi").getBytes("utf-8"));

// 设置value = "test_value"
ByteSequence value = ByteSequence.from("test_value".getBytes("utf-8"));

// 将key和value写入到etcd
kvClient.put(key, value).get();

提示:java etcd依赖配置,请参考连接etcd章节

2.查询数据

// 连接etcd
Client client = Client.builder().endpoints("http://localhost:2379").build();
// 获取KV client
KV kvClient = client.getKVClient();

// 设置Key = "/tizi"
ByteSequence key = ByteSequence.from(new String("/tizi").getBytes("utf-8"));

// 查询get
CompletableFuture<GetResponse> getFuture = kvClient.get(key);

// 获取get请求的结果
GetResponse response = getFuture.get();
// 通过getKvs可以查询get请求返回的结果,可能存在多个Key的情况,所以需要遍历
response.getKvs().forEach( obj -> {
   // logger是slf4j的Logger对象
   // 查询到的key/value也是字节类型,需要转换,这里转换成字符串。
   logger.info("kv: {} {}", obj.getKey().toString(utf8), obj.getValue().toString(utf8));
 });

3.前缀匹配

etcd支持根据前缀匹配搜索key。

接上面查询数据的例子:

// 只要为get方法传入GetOption参数,设置前缀匹配的key即可

// 带匹配的key前缀
ByteSequence key = ByteSequence.from("/tizi".getBytes());

// 构建GetOption对象,通过withPrefix方法,设置前缀匹配的key
GetOption op = GetOption.newBuilder().withPrefix(key).build();

// 通过KV client的get方法查询,跟普通的get请求的区别就是多了一个GetOption参数
CompletableFuture<GetResponse> getFuture = kvClient.get(key, op);

4.删除数据

ByteSequence key = ByteSequence.from("/tizi".getBytes());

kvClient.delete(key).get();

// 根据key前缀匹配,批量删除
DeleteOption deleteOption = DeleteOption.newBuilder().withPrefix(key).build();
kvClient.delete(key, deleteOption).get();