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();